Linux 下 syslog 丢失(日志没写进去、写不全、或被覆盖)是很常见的问题,原因通常可以归为以下几类。我按「最常见 → 较少见」给你梳理,并给出排查方法。
systemctl status rsyslog
# 或
systemctl status syslog-ng
如果服务挂了、重启失败,日志就不会落盘。
表现:
/var/log/messages 不更新logger "test" 无反应解决:
systemctl restart rsyslog
journalctl -u rsyslog -e
在现代系统里:
如果 rsyslog 没配置 @@ 或 imjournal,就会“看起来丢了”。
检查:
# /etc/rsyslog.conf
module(load="imjournal")
否则很多服务日志只在 journalctl 里能看到。
logrotate 配置不当会:
典型错误:
/var/log/messages {
copytruncate # 忘记 restart syslog
}
结果:rsyslog 仍写旧 fd,新文件无内容。
df -h
df -i
现象:
syslog 按级别过滤:
emerg < alert < crit < err < warning < notice < info < debug
如果你的程序只发 debug,但配置是:
*.info
那 debug 日志直接丢。
例如程序发到 local0,但 syslog 没配:
local0.* /var/log/app.log
多见于:
Docker 容器:
解决:
docker run -v /dev/log:/dev/log
/var/log 不可写排查:
ausearch -m avc
dmesg | grep audit
1. systemctl status rsyslog
2. df -h && df -i
3. journalctl -u rsyslog -e
4. logger test && tail /var/log/messages
5. 检查 /etc/rsyslog.conf 和 logrotate 配置
你可以补充:
我可以直接给你对应的配置示例。