journalctl 是 systemd 日志体系的控制台,需启用持久化存储(Storage=persistent)并配置 /var/log/journal/ 目录才能查历史日志;支持按服务、时间、内核、启动会话等结构化字段精准过滤,可导出 JSON、实时跟踪、限制磁盘占用。

journalctl 不是“翻日志文件”的替代品,而是 systemd 日志体系的控制台。它直接对接 journald 这个二进制、结构化、带索引的日志服务——你查不到内容,往往不是命令输错了,而是没打开它的正确开关。
先确认日志是否真正持久化
很多用户执行 journalctl -b 什么也看不到,或只看到最近几条,问题常出在日志没存盘。默认情况下,journald 可能只把日志写在内存(/run/log/journal/),重启就清空。
- 检查
/var/log/journal/是否存在且非空:ls /var/log/journal/ - 若目录不存在,手动创建并授权:
sudo mkdir -p /var/log/journal && sudo chown root:systemd-journal /var/log/journal && sudo chmod 755 /var/log/journal - 编辑
/etc/systemd/journald.conf,确保这一行启用:Storage=persistent - 重启服务生效:
sudo systemctl restart systemd-journald
按场景快速定位关键日志
别从头翻起。journalctl 的价值在于用结构化字段做精准切片:
- 查某个服务崩溃原因:用
journalctl -u nginx.service -p err -b(当前启动中所有 nginx 错误) - 查刚发生的异常:用
journalctl --since "5 minutes ago"或--since "2026-08-29 02:45:00" - 查内核级问题(如驱动、硬件识别失败):加
-k,例如journalctl -k --since today - 查某次特定启动全过程:先运行
journalctl --list-boots看编号,再用journalctl -b -1(上一次)或journalctl -b 12345678-...ab(指定 Boot ID)
输出与过滤要配合使用
光靠 -f 或 -n 不够,得组合元数据字段才能提效:
- 实时盯一个服务的最新 50 行:
journalctl -u docker.service -n 50 -f - 只看消息正文(去掉时间戳、PID 等):
journalctl -u sshd -o cat - 导出为 JSON 方便脚本处理:
journalctl -u nginx --since "1 hour ago" -o json-pretty | head -20 - 查某个用户的进程日志:
journalctl _UID=$(id -u)(普通用户可查自己,系统日志需 root 或 systemd-journal 组权限)
清理与空间管理不能忽略
日志不清理会悄悄占满磁盘,尤其在长期运行的服务器上:
- 看当前占用:
journalctl --disk-usage - 删掉 30 天前的所有日志:
sudo journalctl --vacuum-time=30d - 限制总大小为 500MB:
sudo journalctl --vacuum-size=500M - 永久生效:在
/etc/systemd/journald.conf中设置MaxRetentionSec=30day和SystemMaxUse=500M


















