systemd 不仅管理服务,还自带了一套结构化的日志系统,称为 journal。传统的 syslog 通常按文本文件按行记录,而 journal 以二进制格式存储日志,每条日志除了消息正文外,还自动附带上精确的时间戳、进程 PID、用户 ID、服务单元名、优先级等字段。这使得我们可以用 journalctl 命令进行精确的查询和过滤,而无需手动去翻看 /var/log/ 下的多个文件。
1. 基础查询
不加任何选项直接执行 journalctl 会以 less 分页的方式显示本次启动以来的所有系统日志,从最早到最新。你可以使用方向键、PageUp/PageDown 滚动,按 / 搜索,按 q 退出。
journalctl
如果只想查看本次启动的日志,可用 -b(默认就是当前启动):
journalctl -b
查看上一次启动的日志(常用于排查上次异常关机的原因):
journalctl -b -1
像 tail -f 一样持续追踪最新日志:
journalctl -f
2. 按单元(服务)过滤
最有用的过滤选项是 -u,后跟服务单元名。例如查看 SSH 服务的所有日志:
journalctl -u ssh.service
可以带上 -b 只查看本次启动以来该服务的日志:
journalctl -u nginx.service -b
多个 -u 可以同时查看关联单元,比如同时查看 NetworkManager 和 wpa_supplicant:
journalctl -u NetworkManager.service -u wpa_supplicant.service
3. 按时间范围过滤--since 和 --until 接受自然语言或精确日期时间,非常灵活:
journalctl --since "2025-04-01 09:00:00" --until "2025-04-01 10:00:00"
journalctl --since yesterday
journalctl --since "1 hour ago"
这两个选项可以和其他过滤条件组合使用,轻易锁定某个时间段内的事件。
4. 按优先级过滤
日志优先级遵循 syslog 等级:emerg (0)、alert (1)、crit (2)、err (3)、warning (4)、notice (5)、info (6)、debug (7)。-p 选项可以指定最低级别,所有等于或高于该级别的日志都会被显示。例如只看错误及更严重的消息:
journalctl -p err
只看某个服务的所有警告及更高级别:
journalctl -u docker.service -p warning
5. 内核消息、用户日志与更多查询目标
journalctl -k:显示内核消息(等效于dmesg)。journalctl --user:查询当前用户的用户级服务日志(用户 systemd 实例)。- 查看特定进程 ID 产生的日志:
journalctl _PID=1234
- 根据用户 ID 或命令路径过滤:
journalctl _UID=1000
journalctl _COMM=sshd
6. 磁盘空间与维护
journal 会自动进行日志轮替和清理,默认最大占用 4GB 或文件系统 10% 的空间(取较小值)。你可以查看当前日志占用:
journalctl --disk-usage
如果需要手动清理旧日志:
journalctl --vacuum-time=7d # 只保留最近7天的日志
journalctl --vacuum-size=500M # 当日志超过500MB时,删除最旧的条目
7. 将日志存储配置为持久化
默认情况下,journal 日志只保存在 /run/log/journal/ 目录下,这是一个位于内存中的临时文件系统,重启后消失。如果你希望日志在重启后仍然可查,就需要启用持久化存储。
最简单的方法是手动创建存储目录(如果不存在):
sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald
这会让 journald 将日志写入 /var/log/journal/,重启后仍保留。
为了长期化管理,建议编辑配置文件 /etc/systemd/journald.conf,找到 Storage= 行,将其设为 persistent:
[Journal]
Storage=persistent
同时你也可以限定日志总大小,例如 SystemMaxUse=500M,确保不会意外占满磁盘。修改后重启服务生效:
sudo systemctl restart systemd-journald
此后便可用 journalctl 查阅历史记录,再也不担心重启丢失重要线索。
8. 与 syslog 的互补关系
许多 Linux 发行版仍然同时运行着 rsyslog 或 syslog-ng,传统的 /var/log/syslog、/var/log/messages 等文本文件依然被写入。journald 可配置为将日志转发给 syslog 守护进程(ForwardToSyslog=yes),从而兼顾结构化查询和文本文件保留的双重需求。如果你习惯于直接用 grep 搜索日志文件,可以继续沿用,但面对复杂的多服务关联问题时,journalctl 带来的精确筛选能力会让你事半功倍。
掌握这些命令和配置,你就拥有了快速定位系统问题的时间旅行能力。