journalctl 是 systemd 日志的唯一权威接口,-b 按启动序号查日志,-u -p 按服务和优先级过滤,-n 和 --since 限制输出,-o 指定导出格式,storage=persistent 决定日志持久性。

journalctl 是 systemd 日志的唯一权威接口,不用它查日志,等于没查 —— 尤其在 CentOS 8+/RHEL 8+、Ubuntu 16.04+ 等现代发行版上,syslog 或 /var/log/messages 已不完整甚至完全失效。
查最近一次开机的日志
重启后想快速定位启动失败点?journalctl -b 最直接。它默认显示当前 boot 的全部日志;加 -b -1 查上一次启动,-b -2 查再上一次——数字越负,越久远。
-
journalctl -b不带参数时只输出,不实时跟踪;要边看边刷新,加-f(类似tail -f) - 如果系统启用了
Storage=persistent(检查/etc/systemd/journald.conf),关机日志才保留;默认Storage=auto在无/var/log/journal目录时退化为volatile,断电即丢 -
-b依赖 boot ID,不是时间戳;所以即使系统时间错乱,它依然能准确区分各次启动
按服务名过滤并查看错误行
查某个服务(比如 sshd)的报错,别用 grep 全局扫:效率低、上下文断、还可能漏掉结构化字段(如优先级、UID)。正确姿势是用 -u + -p:
-
journalctl -u sshd.service -p err只显示sshd的 error 及以上级别(err、crit、alert、emerg) -
-p支持debug、info、notice、warning、err、crit、alert、emerg,注意err不包含warning - 若服务有多个实例(如 socket-activated),
-u仍能匹配所有相关 unit,比--identifier=sshd更可靠
限制输出行数和时间范围
生产环境日志量大,不加约束的 journalctl 可能卡死终端或拖垮 SSH 连接。必须主动限流:
- 用
-n 50限制最后 50 行(默认是全部),搭配-f时尤其关键:journalctl -u nginx -n 20 -f - 时间范围推荐用
--since和--until,支持自然语言:journalctl --since "2 hours ago"、journalctl --since "2024-05-20 14:00:00" - 避免用
--since="today":它指「00:00:00 起」,但某些时区或 NTP 同步延迟下行为不稳定;显式写日期更可控
导出日志并转成文本分析
需要把日志交给同事或导入 ELK?别用重定向(journalctl > out.log),那会丢失颜色、分页和二进制字段。用 --output 显式指定格式:
-
journalctl -u docker --since "1 day ago" -o json输出 JSON,每行一个对象,适合脚本解析 -
-o short-iso或-o verbose适合人工阅读;-o export是二进制格式,仅用于journalctl --import回灌,别误当文本用 - 导出前先确认磁盘空间:
journalctl --disk-usage;清理旧日志用journalctl --vacuum-size=500M或--vacuum-time=2weeks,别直接删/var/log/journal/下文件
真正麻烦的不是命令记不住,而是忘记 journal 默认不持久、-p 级别不包含低一级日志、以及 --since 在跨时区机器上可能漂移——这些点不踩一遍,很难信。











