journalctl 是什么
journalctl 是 systemd 日志系统的查询入口。journald 把内核消息、服务进程的标准输出与标准错误、以及通过 syslog 兼容接口提交的日志统一收进二进制 journal,再按单元、优先级、启动轮次、自定义字段建立索引。正因为是结构化存储,才能做到「只看某个服务、某个时间段、某级别以上」这类过滤,这是纯文本日志文件做不到的。日志默认写入 /var/log/journal,若该目录不存在则退化为 /run/log/journal 内存态,重启后丢失。
基本信息
| 适用平台 | Linux(systemd 发行版:CentOS/RHEL 7+、Ubuntu 16.04+、Debian 8+、openSUSE 等) |
|---|---|
| 命令语法 | journalctl [选项] [匹配条件] |
| 常用选项 | -u 指定单元、-f 实时跟随、-n 行数、-p 优先级、--since/--until 时间、-b 启动轮次、-k 内核消息、-o 输出格式、-x 附解释、--no-pager 不分页 |
| 权限说明 | 普通用户默认只看得到自己的消息;读系统日志需 sudo 或加入 systemd-journal 组(Debian 系常同时给 adm 组) |
| 容量控制 | /etc/systemd/journald.conf 的 SystemMaxUse、MaxRetentionSec;用 --disk-usage 与 --vacuum-* 查看与清理 |
典型使用场景
- 服务起不来:先看 systemd 层的失败原因(找不到可执行文件、权限不足、依赖未启动),再进应用日志
- 实时跟随:修改配置或复现问题时 -f 盯着目标单元的输出
- 时间窗回溯:--since '10 min ago' -p err 只看最近十分钟的错误及以上级别
- 宕机重启后取证:-b -1 查看上一次启动的日志,配合 --list-boots 确认轮次编号
- 内核与硬件问题:-k 看 OOM 击杀、磁盘错误、驱动告警
- 结构化分析:-o json 交给 jq 按字段统计,或 -o short-precise 看清毫秒级时序
常用示例
常用示例
journalctl -xe # 最近错误 + 上下文解释,快速上手
journalctl -u nginx -n 100 --no-pager # 某服务最近 100 行
journalctl -f -u myapp # 实时跟随某服务
journalctl --since '10 min ago' -p err
journalctl --since today --until '2026-10-12 10:00'
journalctl -b -1 # 上一次启动的日志
journalctl --list-boots # 列出所有启动轮次
journalctl -k -p warning | tail -50 # 内核告警
journalctl -o json -u myapp | jq -r '.["MESSAGE"]' | tail -20过滤选项速查
| 选项 | 作用 | 典型用法 |
|---|---|---|
| -u 单元 | 只看某个 systemd 单元的日志 | -u nginx、-u 'myapp.service' |
| -p 级别 | 按 syslog 优先级过滤,包含该级别及更严重的 | -p err 等同 0-3 级,即 emerg/alert/crit/err |
| -b N | 按启动轮次过滤,0 为当前,-1 为上一次 | -b -1 查崩溃前那一轮 |
| -k | 只看内核消息,等价于 -dmesg | 查 OOM 与硬件错误 |
| --since/--until | 时间窗过滤,支持自然语言 | --since '2 hours ago' |
| -o 格式 | 输出样式:short、json、verbose、cat | cat 去掉元信息只留消息正文 |
| -n 行数 | 限制输出条数;与 -f 连用时表示先回显多少条历史 | -n 0 -f 只看新产生的日志,适合复现问题 |
| --no-pager | 不进入分页器,直接输出到终端 | 脚本、定时任务与管道里务必加上 |
优先级数值:0 emerg、1 alert、2 crit、3 err、4 warning、5 notice、6 info、7 debug。journalctl -p err 会显示 0 到 3 级;-p 4 则包含 warning 及以上,排查时按需逐级放宽。
日志是否持久化取决于 /var/log/journal 目录是否存在(journald.conf 中 Storage=auto 的含义)。只能看到本次启动的日志时,说明走的是 /run/log/journal 内存存储,重启即清空。清理空间用 journalctl --vacuum-size=500M 或 --vacuum-time=7d。
应用若把日志交给 syslog 或自己写文件,journal 里往往只有 systemd 层的启动与退出记录。此时 systemd 报「进程退出码非 0」只是结论,真正的堆栈要去应用自己的日志目录里找。
持久化与限量的配置:Storage=auto 时只要 /var/log/journal 目录存在就写磁盘,要强制持久化写成 persistent(journald 会自动创建目录)。SystemMaxUse 限制日志总量(默认约为文件系统容量的 10%),SystemKeepFree 保证至少留出的空闲空间,MaxRetentionSec 按时间回收。改完 journald.conf 需要 systemctl restart systemd-journald 才生效。
结构化字段可以直接当过滤条件:journalctl _COMM=sshd 按进程名查,journalctl _PID=1234 按进程号查,SYSLOG_IDENTIFIER 对应 syslog 的 tag。用 -o verbose 打印全部字段,能确认某个服务究竟以哪个单元名与标识符登记,避免 -u 猜错名字。