先看现象。一台跑着自研网关的 CentOS 7.9,装机时把 /var/log 单独划了 2G,上线第三天监控告警分区使用率 100%,messages 一天涨 800M,rsyslog 开始丢弃日志,应用的错误记录也一起没了。

真正麻烦的地方在于,几个原因的现象几乎一样。rsyslog 把所有 facility 都写进 messages,内核的 netfilter 日志量特别大。也可能是docker 的 json 日志同时往 journald 和 messages 里灌了一份。

另外,有进程在循环打同一条错误,日志刷得比轮转快。

少数情况下是logrotate 的 weekly 周期对这个分区来说太长,一天就顶到上限。

上来先看是谁在写这么多

awk '{print $5}' /var/log/messages | sort | uniq -c | sort -rn | head

接着把内核日志和业务日志分开写

echo 'kern.* /var/log/kern.log' > /etc/rsyslog.d/10-kern.conf

给 messages 加按天轮转并限量

logrotate -f /etc/logrotate.d/syslog

系统级限制 journal 的占用

journalctl --vacuum-size=200M

白天有业务在跑,能验证的部分都压到了晚上做。

怎么算真的好了,看的是同一批现象。/var/log 使用率降到 40% 以下,rsyslog 不再报丢弃,连续观察一天后增量与轮转能对上。

分区先扩一点比设轮转更稳,动手前用 lsof 确认没有进程还握着被删的日志文件。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189