这类问题我又碰上了一次。CentOS 7.9 上同时开了 systemd-journald 的 ForwardToSyslog=yes,rsyslog 又配了 imjournal 去读,messages 里每条日志出现两次,时间戳只差几十毫秒。
第一反应是「应用同时写 syslog 和 stdout,两路都进了 journal」,验证下来不成立。
这类报错背后常见的原因有几处,逐个排除就行。rsyslog 的 imjournal 和 imuxsock 同时启用,同一条日志被读了两遍;ForwardToSyslog 打开后 journald 写 socket,imuxsock 又收一份;转发规则重复匹配,同一条消息被写了两次文件。
上来先确认重复来自哪个输入模块
grep -n -E 'imjournal|imuxsock' /etc/rsyslog.conf | head -20
再往下关掉其中一路输入
sed -i 's/^module(load="imjournal"/#module(load="imjournal"/' /etc/rsyslog.conf
随后关掉 journald 的 syslog 转发
sed -i 's/^#*ForwardToSyslog.*/ForwardToSyslog=no/' /etc/systemd/journald.conf
等前面都确认过,再重启两个服务再比对
systemctl restart systemd-journald rsyslog && logger -t dup-test 'hello' && grep -c 'dup-test' /var/log/messages
中途换过一次思路,把范围缩到最小的那一层,反而快了。
中间停过一次,把已经改的东西回滚干净,再重新来一遍。
恢复的判定其实很直接。logger 打一条测试日志,messages 里只出现一次,journalctl -t dup-test 也只有一条。
提醒一点。imjournal 和 imuxsock 二选一就行,两个都开必然重复;关掉 ForwardToSyslog 后 journalctl 仍保留全量,不影响排查。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
