Linux journalctl 的过滤表达式与 systemd unit 日志持久化配置

12次阅读

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

Linux journalctl 的过滤表达式与 systemd unit 日志持久化配置

journalctl 是 systemd 日志系统的核心查询工具,其过滤能力依赖于日志字段(如 _SYSTEMD_UNITPRIORITY_HOSTNAME 等)和布尔逻辑组合。日志是否能跨重启保留,则取决于 journald 的持久化配置,而非 journalctl 本身。

常用 journalctl 过滤表达式写法

journalctl 支持基于字段的等值匹配、范围匹配和布尔组合,不支持正则或模糊搜索(需配合 grep):

  • 按 unit 名称过滤:journalctl -u sshd.servicejournalctl _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=500MSystemMaxFileSize=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

text=ZqhQzanResources