首页/系统/Linux 运维命令速查/journalctl 查询 systemd 日志

journalctl 查询 systemd 日志

journalctl 是 systemd 时代的日志总入口:按服务、时间、优先级、启动轮次过滤,-f 实时跟踪、-u 按单元、-xe 跳转到错误尾部,server 排障常用命令。

Linux 运维命令速查系统更新于 2026-10-13

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、catcat 去掉元信息只留消息正文
-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 猜错名字。

易错点

  • 重启后旧日志在 -b -1 那一轮,误以为日志丢失;先用 --list-boots 核对轮次编号
  • 非 systemd 全接管的老服务或自写文件的服务日志不完整,journal 里找不到就去 /var/log/ 下翻
  • 脚本和自动化里忘记 --no-pager,输出进分页器会把流程挂住
  • 普通用户直接执行会看不到系统日志,被误判为「没有日志」;需要 sudo 或加入 systemd-journal 组
  • journald 有容量上限,长期排障前先确认历史窗口够长,必要时调大 SystemMaxUse 并配合外部日志系统

数据来源与参考

  • man 1 journalctl(systemd)
  • man 5 journald.conf

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌