journalctl 查不到历史服务日志是因为 journald 默认使用内存临时存储,需启用持久化:创建 /var/log/journal 目录、初始化权限、重启 systemd-journald 服务。

journalctl 查不到服务日志?先确认 journald 是否持久化
很多运维一查 journalctl -u nginx.service 发现只有最近几次启动的日志,重启后全没了——这不是命令用错了,而是 systemd-journald 默认把日志存在 /run/log/journal/,这个路径是内存挂载(tmpfs),系统重启就清空。
真正要长期保留开机前、崩溃前、甚至离线时的日志,必须手动启用持久化:
- 创建持久化目录:
sudo mkdir -p /var/log/journal - 初始化权限和结构:
sudo systemd-tmpfiles --create --prefix /var/log/journal - 重启服务生效:
sudo systemctl restart systemd-journald
做完这三步,journalctl --list-boots 就能看到历史启动记录,journalctl -b -2 也能查上上次启动的完整日志。漏掉第一步或没重启服务,配置就等于白设。
rsyslog 为什么收不到 journal 日志?检查 imjournal 模块和组权限
默认 rsyslog 并不直接监听 /dev/log 接传统 syslog 流,而是通过 imjournal 模块从 journald 的二进制日志里“订阅”数据。一旦它收不到日志,常见原因就两个:
-
imjournal模块未加载:检查/etc/rsyslog.conf或/etc/rsyslog.d/*.conf中是否有$ModLoad imjournal;没有就加上,否则 rsyslog 根本不连 journald - 用户权限不足:rsyslog 进程以
syslog用户运行,但 journald 只允许systemd-journal组成员读取日志。执行:sudo usermod -a -G systemd-journal syslog,再sudo systemctl restart rsyslog
这两个点只要错一个,/var/log/messages 就会断更——尤其在最小化安装的 CentOS/RHEL 系统上,systemd-journal 组可能根本不存在,得先 sudo groupadd systemd-journal。
该用 journalctl 还是 tail -f /var/log/messages?看你要查什么
不是“哪个更好”,而是“场景不同”。journald 和 rsyslog 不是替代关系,是分工关系:
- 查实时错误 + 元数据(比如某个崩溃进程的
_PID、_CMDLINE、_UID):用journalctl -f -p err,它能立刻过滤出 ERROR 级别且带完整上下文 - 查归档分析 + 正则匹配 + 配合 awk/grep/cut 做统计:用
tail -f /var/log/secure,文本格式天然适配所有 shell 工具 - 查内核早期日志(比如 initramfs 阶段)、systemd 启动失败、cgroup 权限拒绝等 rsyslog 根本收不到的内容:只能靠
journalctl -b -1或journalctl --dmesg
rsyslog 输出的文本日志本质是 journald 的“下游副本”,所以它永远比 journalctl 慢半拍,也永远少一部分字段(比如 _EXE、_CAP_EFFECTIVE)。想查得全、查得快,绕不开 journalctl。
日志磁盘爆满?别只删 /var/log/messages
很多人发现 /var/log 占满,第一反应是 rm /var/log/messages*,结果过两天又满了——因为真正的“大户”可能是 /var/log/journal/ 下的二进制文件,单个文件动辄几百 MB,且默认不限大小。
控制它的方法不在 rsyslog 配置里,而在 journald 自身:
- 限制总占用:
SysteMaxUse=512M(写入/etc/systemd/journald.conf) - 限制单次启动最大体积:
SystemMaxFileSize=100M - 清理旧日志:
sudo journalctl --vacuum-size=200M或--vacuum-time=2weeks
注意:journalctl --vacuum-* 只对已持久化的 /var/log/journal/ 生效;如果还停留在 /run/log/journal/,重启就自动清了,但你永远拿不到历史数据。
最常被忽略的一点:journald 和 rsyslog 的日志是并存的,不是互斥的。关掉一个并不会让另一个“多干活”,反而可能丢日志。真正要精简,得明确每条日志的流向——谁采集、谁过滤、谁落盘、谁转发,少一个环节,排查链就断一截。










