journalctl 是 systemd 日志查询工具,依赖字段过滤与布尔逻辑;日志跨重启保留需配置 journald 持久化(storage=persistent 等),而非 journalctl 本身。

journalctl 是 systemd 日志系统的核心查询工具,其过滤能力依赖于日志字段(如 _SYSTEMD_UNIT、PRIORITY、_HOSTNAME 等)和布尔逻辑组合。日志是否能跨重启保留,则取决于 journald 的持久化配置,而非 journalctl 本身。
常用 journalctl 过滤表达式写法
journalctl 支持基于字段的等值匹配、范围匹配和布尔组合,不支持正则或模糊搜索(需配合 grep):
- 按 unit 名称过滤:
journalctl -u sshd.service或journalctl _SYSTEMD_UNIT=sshd.service - 按优先级过滤(0=emerg, 6=info):
journalctl PRIORITY=3(显示 error 级别),或journalctl -p err - 组合多个条件(AND 逻辑):
journalctl _SYSTEMD_UNIT=nginx.service PRIORITY>=4 - 排除某 unit:
journalctl -u nginx.service -u apache2.service --all(先列出全部,再用--all避免默认截断);真正排除需用grep -v,例如journalctl | grep -v 'systemd-udevd' - 按时间范围:
journalctl --since "2024-05-01 10:00:00" --until "2024-05-01 12:00:00"
journald 日志持久化关键配置项
默认情况下,journald 只将日志保存在内存(/run/log/journal/),重启即丢失。要实现持久化,需启用磁盘存储并合理配置空间策略:
- 确认
/var/log/journal/目录存在且可写:若不存在,手动创建并设属主root:systemd-journal,权限2755 - 编辑
/etc/systemd/journald.conf,确保以下项非注释且值合理:-
Storage=persistent(启用磁盘日志,必须) -
Compress=yes(节省空间,默认开启) -
MaxRetentionSec=1month(自动清理旧日志,可选) -
SystemMaxUse=500M和SystemMaxFileSize=100M(限制总大小与单文件上限)
-
- 重载配置:
sudo systemctl kill --signal=SIGHUP systemd-journald(或重启 journald:sudo systemctl restart systemd-journald)
验证日志是否已持久化
执行后可通过以下方式确认配置生效:
- 检查日志路径:
ls /var/log/journal/*/system.journal应有实际文件(非空目录) - 查看运行时配置:
journalctl --disk-usage显示当前磁盘占用;若输出为Archived and active journals take up 0B,说明未启用持久化 - 重启系统后运行
journalctl --list-boots,应看到多条 boot 记录(每条对应一次启动),且journalctl -b -1能查到上一次启动的日志
补充说明:unit 日志的特殊性
某些 unit(如 transient unit 或通过 systemd-run 启动的临时服务)可能不会出现在 journalctl -u 列表中,但日志仍带 _SYSTEMD_UNIT=xxx 字段,可用字段过滤定位。另外,容器化环境(如 Podman)中,若容器未以 systemd unit 方式运行,其日志通常不进入 journald,除非显式配置 --log-driver=journald。










