这个坑值得记一笔。logrotate 配的是每天 00:00 切分 切完 Nginx 还握着旧文件句柄 新日志写进带日期后缀的旧文件 分析脚本按 access.log 读 那天只有 300 行 抓取异常正好发生在切换后半小时

刚开始盯着「切分时间与业务高峰重叠」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。切分后没有给 Nginx 发 USR1 句柄没切换;脚本只读固定文件名 不读归档;压缩归档后文件名变化 脚本匹配不到。

动手时先确认切分后句柄是否切换

ls -l /proc/$(pgrep -f 'nginx: master')/fd | grep access

随后在 postrotate 里发信号

kill -USR1 $(cat /run/nginx.pid)

接着分析时按通配符读取全部日志

zcat access.log*.gz access.log | awk '{print $7}' | sort | uniq -c | head

末了把切分时间挪到低峰并保留 14 天

daily rotate 14

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

改完先别撤,确认这几项。切分当天日志行数正常 分析结果连续不断档 归档文件能被正常解压读取。

容易忽略的是,日志切分不是复制文件 不发信号 Nginx 会一直往被重命名的旧文件里写。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189