journalctl 是 systemd 系统下查看日志的默认首选工具,它比直接读取 /var/log 文件更准、更快、更结构化,因许多服务只向 journald 发送日志而不写磁盘。

journalctl 是 systemd 系统下查看日志的唯一推荐方式,直接读取 /var/log/journal/ 文件或依赖 syslog 工具(如 tail -f /var/log/syslog)在多数现代发行版中已不可靠或不完整。
journalctl 查看最近 100 条启动日志
系统重启后,旧日志会被归档,journalctl 默认只显示当前启动的日志。想快速确认本次开机是否异常,用:
journalctl -b
加 -n 100 限制行数更实用:
journalctl -b -n 100
-
-b表示 “boot”,等价于--boot;不带参数时默认是最新一次启动 -
-n 100不是“最近 100 秒”,而是“最后 100 行”,避免刷屏 - 若需查上一次启动(比如刚重启完想回溯前一次崩溃),用
journalctl -b -1;-2、-3同理 - 部分精简版系统(如某些容器或 WSL)可能禁用持久化日志,此时
journalctl --list-boots会返回空,需先运行sudo mkdir -p /var/log/journal && sudo systemctl restart systemd-journald
按服务名过滤日志(例如 nginx 或 sshd)
比 grep 更准——journalctl 原生支持单元(unit)级过滤,避免日志交叉干扰:
journalctl -u nginx.service
- 服务名必须带
.service后缀,nginx或nginx.service单独写会报错No journal files were found - 查失败的启动尝试:加
--failed,如journalctl --failed列出所有最近失败的 unit - 实时跟踪:加
-f,但注意journalctl -u nginx.service -f只输出新日志,不会补历史;如需补全再加-n 50 - 若服务由 socket 激活(如
sshd.socket),查sshd.service才能看到连接处理日志,查 socket 单元只能看到监听行为
按时间范围筛选日志(避免翻到三天前的无关记录)
时间格式宽松,但必须用英文单词或 ISO 格式,中文或“昨天”会解析失败:
journalctl --since "2024-05-20 14:00:00" --until "2024-05-20 15:30:00"
- 常用简写:
--since "1 hour ago"、--since "yesterday"、--since "2024-05-20"(自动补为 00:00:00) -
--until不支持相对时间(如"30 minutes ago"),只能用绝对时间或"now" - 时区默认按系统本地时间,跨时区协作时建议统一加
--utc,否则排查问题容易错 8 小时 - 大量日志下加
--no-pager避免卡在 less 里;配合| grep时它会自动禁用分页
导出日志为文本或 JSON 方便分析
直接重定向到文件即可,但注意默认输出含颜色和特殊控制符,影响后续 grep 或导入工具:
journalctl -u nginx.service --since "today" --no-hostname --output=short-iso > nginx-today.log
-
--no-hostname去掉主机名前缀,多机日志合并时更干净 -
--output=json输出结构化 JSON,每行一个对象,适合jq处理;但注意字段名含下划线(如_PID、SYSLOG_IDENTIFIER),不是驼峰 - 二进制日志本身不加密,
journalctl --export生成二进制流,仅用于备份/迁移,人类不可读 - 日志体积大时,
--all(输出所有字段)会让单行超长,建议先用--fields查看可用字段,再用--output-fields=...精确指定
真正麻烦的不是命令记不住,而是忘了 journal 日志默认不持久化——重启后旧日志消失,除非手动创建 /var/log/journal 目录并重启 systemd-journald。这点在调试偶发故障时最容易踩空。


















