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

journalctl 查不到开机前日志?先确认持久化是否启用
默认情况下,journald 日志只存在内存或 /run/log/journal/(volatile),重启即清空。所谓“查不到上次关机前的日志”,不是命令用错了,而是根本没存下来。
- 检查是否已启用持久化:
ls /var/log/journal/—— 若报错“No such file”,说明还没开启 - 启用步骤三步走:
sudo mkdir -p /var/log/journal→sudo systemd-tmpfiles --create --prefix /var/log/journal→sudo 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;若为inactive,rsyslog就是空转 - 常见现象:
/var/log/messages有内容但/var/log/secure为空?很可能是authpriv.*规则被其他配置覆盖,或imjournal未启用导致认证日志压根没进 rsyslog 流水线
日志级别和设施过滤别硬背,用 journalctl 原生字段更准
传统 rsyslog 的 authpriv.info 这类写法,在 journalctl 里并不直接对应——它用的是结构化字段,比如 SYSLOG_FACILITY 和 PRIORITY,且优先级数值反直觉(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 不记邮件日志,其实它只控制 rsyslog 从 imjournal 接收后“要不要落盘到 /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-journald 和 systemctl status rsyslog 的 Active 状态、Latest log line 时间戳、以及 journalctl -u rsyslog -n 20 里有没有 module load Error 或 permission denied。