CentOS 7 上 rsyslog 8 把日志转发到中心机 10.0.0.9:514,中心机维护停了三天,/var/log/messages 里出现 queue file full, discarding,恢复后那三天的日志中心机一条都没有。
原因不止一个,得分开看。默认用内存队列,条数一满直接丢弃,断链期间没有落地缓冲;action.resumeRetryCount 是正数,重试用完就放弃;磁盘队列没开,或者队列上限只有几十 M,撑不住三天。
弄清当前队列类型
grep -rn 'queue.type' /etc/rsyslog.conf /etc/rsyslog.d/
然后改成磁盘辅助队列
action(type="omfwd" target="10.0.0.9" port="514" protocol="tcp" queue.type="Disk" queue.filename="fwdq" queue.maxDiskSpace="2g" queue.saveOnShutdown="on")
接着把重试改成无限
action.resumeRetryCount="-1" action.resumeInterval="30"
校验配置并重启
rsyslogd -N1 && systemctl restart rsyslog
手上没有现成的复现脚本,就照着线上请求手工拼了一个。
报错是间歇性的,我蹲守了半小时才抓到一次完整现场。
别只看报错消失,验证要多做一步。断开中心机后 /var/spool/rsyslog 下的队列文件持续增长且 messages 里没有丢弃提示,恢复连通后队列归零,中心机能查到断链期间的时间戳。
这里还有个坑。转发链路要留磁盘队列兜底,内存队列只适合允许丢的日志;中心机维护前先把各端的 spool 余量看一遍。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
