CentOS 7.9 上 nginx 日志一天被切了两次,白天也出现带日期的文件,logrotate -d 里能看到同一个路径被两个配置文件各处理了一遍。

一开始怀疑是「主配置里 include 了两个目录,同一份文件被读两次」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。/etc/logrotate.d 下遗留了一份旧配置,路径和新的重复。也可能是包管理器升级时又装了一份默认配置,覆盖了原来的规则。

还有一种情况,cron 里除了 logrotate.timer 还有人手写的定时任务。

上来先把所有引用同一个路径的配置找出来

grep -rl '/var/log/nginx' /etc/logrotate.d/ /etc/logrotate.conf

接着删掉旧的那份,只保留一处

ls -l /etc/logrotate.d/ && rm -f /etc/logrotate.d/nginx.old

然后用调试模式确认只剩一条规则

logrotate -d /etc/logrotate.conf 2>&1 | grep -c 'considering log /var/log/nginx/access.log'

剩下的就是确认定时器只有一个来源

systemctl list-timers | grep logrotate && crontab -l | grep logrotate

恢复的判定其实很直接。logrotate -d 里每个日志路径只出现一次,连续观察两天每天只切一份,日期后缀不再重复。

提醒一点。重复切割会让日志被提前压缩甚至丢失一段,排查时先 grep 路径;升级软件包后要复查 drop-in 目录有没有多出新文件。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189