Linux journald 与 syslog 使用技巧

1次阅读

journalctl查不到开机前日志是因为journald默认未启用持久化,日志仅存于内存或/volatile目录;需创建/var/log/journal并重启journald服务才能保存跨重启日志。

Linux journald 与 syslog 使用技巧

journalctl 查不到开机前日志?先确认持久化是否启用

默认情况下,journald 日志只存在内存或 /run/log/journal/(volatile),重启即清空。所谓“查不到上次关机前的日志”,不是命令用错了,而是根本没存下来。

  • 检查是否已启用持久化:ls /var/log/journal/ —— 若报错“No such file”,说明还没开启
  • 启用步骤三步走:sudo mkdir -p /var/log/journalsudo systemd-tmpfiles --create --prefix /var/log/journalsudo systemctl restart systemd-journald
  • 注意:启用后首次重启才会开始记录前序启动日志;此前的开机记录依然不可恢复
  • 权限陷阱:若 journalctl -b -1 仍报 No journal files were found,大概率是 /var/log/journal/ 所有者不是 root:systemd-journal,用 sudo chown root:systemd-journal /var/log/journal 修正

rsyslog 为什么收不到 journald 日志?重点看 imjournal 和组权限

rsyslog 默认不直接读取 /dev/log,而是通过 imjournal 模块从 journald 的二进制日志中拉取数据。模块没加载、用户没加组、journald 没跑稳,三者任一缺失都会导致日志断流。

  • 确认模块已启用:grep "imjournal" /etc/rsyslog.conf 应返回 $ModLoad imjournal;若被注释,取消注释并重启服务
  • 检查 syslog 用户是否在 systemd-journal 组:getent group systemd-journal;若无 syslog,执行 sudo usermod -a -G systemd-journal syslog
  • 验证 journald 是否运行:systemctl is-active systemd-journald 必须返回 active;若为 inactiversyslog 就是空转
  • 常见现象:/var/log/messages 有内容但 /var/log/secure 为空?很可能是 authpriv.* 规则被其他配置覆盖,或 imjournal 未启用导致认证日志压根没进 rsyslog 流水线

日志级别和设施过滤别硬背,用 journalctl 原生字段更准

传统 rsyslogauthpriv.info 这类写法,在 journalctl 里并不直接对应——它用的是结构化字段,比如 SYSLOG_FACILITYPRIORITY,且优先级数值反直觉(0=emerg,7=debug)。

  • ssh 登录失败(含 PAM 认证拒绝):journalctl SYSLOG_IDENTIFIER=sshd PRIORITY=3(3=err)比 -u sshd 更精准,后者可能漏掉 pam_faillock 等独立单元日志
  • 过滤所有认证相关日志(含 sudo、su、login):journalctl _COMM=pam_faillock _COMM=sudo _COMM=login 或直接 journalctl SYSLOG_FACILITY=10(10=auth)
  • 避免误区:journalctl -p err 只过滤 PRIORITY=3,但有些关键警告(如证书过期)记为 PRIORITY=4(warning),需显式写 PRIORITY=4 或用 PRIORITY=3..7
  • 性能提示:加 --no-pager--quiet 可显著加快大范围过滤速度,尤其在脚本中

rsyslog 规则中 mail.none 之类排除项,实际影响的是 journal→rsyslog 的转发粒度

很多人以为 mail.none 是让 journald 不记邮件日志,其实它只控制 rsyslogimjournal 接收后“要不要落盘到 /var/log/maillog”。journald 本身照单全收,只是 rsyslog 主动丢弃了这部分转发请求。

  • 想彻底禁用某类日志采集?得去改 journald 配置:/etc/systemd/journald.conf 中设 ForwardToSyslog=no 或调整 MaxLevelStore=
  • 典型误配:*.info;mail.none /var/log/messages + mail.* /var/log/maillog 表面合理,但如果 imjournal 未启用,mail.* 规则就完全失效——/var/log/maillog 会一直为空
  • 调试技巧:临时加一条 *.* /var/log/all.log,再对比 journalctl -o json | jq '.SYSLOG_IDENTIFIER',能快速确认哪些标识符实际在 journal 中产生,避免规则写错对象

最常被忽略的一点:journald 和 rsyslog 是两个独立服务,各自有缓存、队列、权限模型。出问题时别默认“配置文件改了就行”,先分别确认 systemctl status systemd-journaldsystemctl status rsyslog 的 Active 状态、Latest log line 时间戳、以及 journalctl -u rsyslog -n 20 里有没有 module load Error 或 permission denied。

text=ZqhQzanResources