journalctl 是什么
journalctl 是 systemd-journald 的查询客户端。systemd 把内核日志、服务标准输出、syslog 消息统一收进结构化日志库,每条记录都带来源、优先级、进程号、启动会话等元数据字段,因此可以按服务、按级别、按时间精确过滤,不必像翻 /var/log/messages 那样全文搜索。日志默认存在 /run/log/journal 下的内存文件系统里,机器重启即清空;要让历史日志落盘,需要启用持久化存储。麒麟 V10、UOS 服务器版、openEuler 都是同一套机制,用法一致。
基本信息
| 所属组件 | systemd-journald |
|---|---|
| 适用平台 | Kylin V10 / UOS 服务器版 / openEuler / CentOS 7+ |
| 默认日志位置 | /run/log/journal(内存,重启清空) |
| 语法 | journalctl [选项] [匹配字段=值] |
| 权限 | root 或 systemd-journal 组、adm 组成员可看全部日志 |
典型使用场景
- 服务启动失败时定位原因:先 status 看提示,再用 -u 单元名 把该服务的日志单独拉出来
- 实时跟踪:部署或复现问题时用 -f 持续输出,等价于 tail -f 但带结构化字段
- 缩小范围:用 -b 只看本次启动的日志,用 --since 卡住变更时间点,避免被历史信息淹没
- 按级别筛错误:-p err 只保留错误及以上,快速判断规模
- 排查内核与硬件问题:-k 只看内核环形缓冲转过来的消息
- 脚本与工单取证:--no-pager 加 -o short-iso 输出可复制的纯文本,时间带时区便于跨系统对账
常用用法
常用用法
journalctl -u nginx -n 100 --no-pager # 该服务最近 100 行
journalctl -u nginx -f # 实时跟踪该服务
journalctl -p err -b --no-pager # 本次启动的错误级日志
journalctl -xe # 最近错误并展开上下文,排障首选
journalctl --since "1 hour ago" --until now # 按时间窗口
journalctl -o short-iso -n 50 --no-pager # 时间带时区的易读格式
journalctl -u nginx --since "2026-10-13 08:00" --until "2026-10-13 09:00" # 精确窗口
journalctl --disk-usage # 当前日志占用的磁盘空间常用选项逐项
| 选项 | 作用 | 使用提示 |
|---|---|---|
| -u 单元 | 按服务过滤 | 可写多个 -u,等于取并集 |
| -b | 限定某次启动会话 | -b -1 上次启动,-b -2 再上一次 |
| -f | 持续跟踪新日志 | 按 Ctrl+C 退出,不产生分页 |
| -p 级别 | 按优先级过滤 | emerg/alert/crit/err/warning/notice/info/debug |
| --since/--until | 时间范围 | 接受 1 hour ago、2026-10-13 08:00 等写法 |
| -o 格式 | 输出格式 | short-iso 带时区,cat 最简,json-pretty 看全字段 |
| -n 行数 | 限制输出条数 | 默认 10 行,脚本里建议显式指定 |
按字段定位进程
按字段定位进程
journalctl _PID=1234 # 只看某个进程号写的日志
journalctl _COMM=mysqld -n 200 # 按可执行文件名过滤
journalctl -u myapp -o json-pretty # 展开全部结构化字段
journalctl -u nginx | grep -i upstream # 在结果里做二次过滤输出被 pager 接管时长行会截断、复制困难,脚本或粘贴场景一律加 --no-pager;如果只关心错误,用 -p err -b 比翻全量日志快得多。日志占满磁盘时先看 --disk-usage,再按保留策略清理。
默认日志在内存里,重启即丢,线上事故回溯常常因此断档。生产环境应确认持久化已开启(/var/log/journal 目录存在或 journald 配置了持久化存储),否则重启后只能靠其它日志系统兜底。
排障时的取日志顺序
- 先用 -xe 看最近的错误与其上下文,拿第一手线索
- 再按服务过滤:-u 服务名 -n 100 拿到包含程序自身输出的完整记录
- 用 -b 限定本次启动,排除上一轮遗留信息造成的误判
- 用 --since 卡住变更时间点,例如部署前后各五分钟
- 把结果重定向到文件再 grep 二次过滤,避免分页器干扰
优先级代表严重程度:emerg、alert、crit 属于严重级别,err 是可确认的错误,warning 多为可恢复异常,notice 与 info 是常规记录,debug 默认通常不落盘。用 -p err 过滤一遍,能迅速判断是单点报错还是成片故障。
同一台机器上多个程序往 syslog 写日志时,用标识过滤比按单元过滤更直接:-t 标识 按程序自己的标识名筛选,适合脚本、计划任务这类没有独立单元的进程;再配合 -n 与时间范围,就能把某一次执行产生的记录单独取出来核对。