journalctl 怎么按服务和本次启动过滤日志?
更新时间:2026-09-19。短答页。systemd 系统上服务日志统一进 journal,掌握几个过滤参数能在排障时少翻 90% 的输出。
一句话回答
用 -u 单元名 限定服务、-b 限定本次启动,再配合 --since/--until、-p err、-f 跟踪,即可快速锁定某次启动后某服务的报错。
常用组合
bash
journalctl -u nginx # 某服务全部日志
journalctl -u nginx -b # 仅本次启动以来该服务日志(最常用)
journalctl -u ngnix -b -p err # 本次启动的 err 及以上级别
journalctl -u kafka --since "10 min ago"
journalctl -u mysql --since "2026-09-19 09:00" --until "09:30"
journalctl -u app -f # 实时跟踪(类似 tail -f)
journalctl -b -p warning --no-pager # 本次启动所有 warning+,不分页
journalctl -k -b # 本次启动的内核日志(dmesg 同源)
journalctl -b -1 -u nginx # 上一次启动(-1)的日志,查崩溃前现场关键参数
| 参数 | 作用 |
|---|---|
-u/--unit | 按 systemd 单元过滤,可多个:-u a.service -u b.service |
-b | 本次启动;-b -1 上一次,--list-boots 列启动记录 |
-p | 优先级:emerg/alert/crit/err/warning/notice/info/debug |
--since/--until | 时间过滤,支持 "1 hour ago"、today、绝对时间 |
-f | 跟踪新日志;-n 100 看最后 N 行 |
-o cat/json-pretty | 输出格式;--no-pager 适合管道处理 |
-g 正则 | 按正则过滤消息内容 |
排查服务「起不来」的标准动作
bash
systemctl status nginx # 先看状态和最近几行
journalctl -u nginx -b -n 200 --no-pager # 本次启动完整上下文
journalctl -k -b | grep -i oom # 是否内核 OOM 杀进程坑
- journal 默认可能只存内存、重启即丢;要持久化需
Storage=persistent(/var/log/journal)。 - 服务名要带对(
nginx.service可简写-u nginx),多个实例用-u app@1.service。 - journal 磁盘会增长,用
journalctl --disk-usage查看、--vacuum-time=7d清理。 - 跨时区/时间写错导致
--since查不到,注意服务器时间和时区。
总结
journalctl 排障的核心是用 -u 锁定 systemd 服务单元、用 -b 限定本次启动(-b -1 看上一次崩溃现场),再叠加 -p err 按级别、--since/--until 按时间、-f 实时跟踪和 -k 看内核日志;服务起不来先 systemctl status 再拉该单元本次启动的完整日志,并确认 journal 是否持久化、用 --vacuum-time 控制磁盘占用。