Linux 的 syslog(或 rsyslog / journald)不记录日志,通常不是“完全不记”,而是记录被关闭、过滤、重定向或配置有误。下面按最常见原因 → 排查方法给你一个系统性的排查清单。
不同发行版默认不同:
| 系统 | 默认日志 |
|---|---|
| CentOS 6 | rsyslog |
| CentOS 7+ | rsyslog + journald |
| Ubuntu 16.04+ | rsyslog / journald |
| Debian | rsyslog |
| 新系统 | systemd-journald |
ps -ef | grep -E 'rsyslog|syslog|journal'
systemctl status rsyslog
如果没启动:
systemctl start rsyslog
systemctl enable rsyslog
journalctl -xe
如果你只看到 journal,看不到 /var/log/messages:
✅ 解决(rsyslog 读取 journal):
# rsyslog.conf
module(load="imjournal")
查看:
grep -R "stop" /etc/rsyslog.conf /etc/rsyslog.d/
常见坑:
*.* stop
或:
local0.none
✅ 临时测试:
logger "test log"
tail -f /var/log/messages
例如:
*.err /var/log/messages
✅ 改成:
*.info /var/log/messages
然后:
systemctl restart rsyslog
ls -l /var/log/messages
如果不存在:
touch /var/log/messages
chmod 600 /var/log/messages
systemctl restart rsyslog
df -h
du -sh /var/log/*
✅ 清理或扩容后重启 rsyslog
getenforce
临时验证:
setenforce 0
如果恢复记录,说明是 SELinux 问题。
例如:
openlog()
syslog()
或:
logger "test"
如果 logger 能记,但你的程序不能,说明程序没发 syslog
logger "hello syslog"
journalctl -xe | grep hello
tail -f /var/log/messages
rsyslogd -dn 2>&1 | less
(调试模式)
journalctl
如果你一定要 /var/log/messages:
# /etc/rsyslog.conf
module(load="imjournal")
| 现象 | 实际 |
|---|---|
| 看不到 /var/log/messages | 记在 journald |
| 只看到部分日志 | 级别过滤 |
| 服务日志消失 | 服务用 stdout,被 systemd 接管 |
| 容器里没日志 | 容器没开 syslog |
1. systemctl status rsyslog
2. df -h
3. logger test
4. journalctl -xe
5. 检查 rsyslog.conf 级别
6. 检查 stop / none
你可以直接贴:
cat /etc/os-release
/etc/rsyslog.conf我可以直接帮你改配置文件,一步到位 ✅