先看现象。日志按天切割,统计脚本只读当天那一段,站长后台的抓取量和抓取统计每天差 15%,越到月底差得越多。

真正麻烦的地方在于,几个原因的现象几乎一样。切割用 copytruncate,零点前后的请求落在两个文件里。也可能是脚本只读当天的 access.log,历史压缩包没解压。

不容易想到的是,日志按 UTC 切割,报表按北京时间汇总。

还有一种情况,跨零点的长连接被记到前一天,切分时丢掉。

先对比压缩包和当前文件的条数

zcat access.log-20261112.gz | wc -l

全量读取后按日期过滤

zcat access.log-*.gz access.log | awk '$4 ~ /13\/Nov\/2026/' | wc -l

手动切一次确认新文件生成

logrotate -f /etc/logrotate.d/nginx

报表统一按东八区汇总

TZ='Asia/Shanghai' date

这类改动我都写进变更记录,过两周再出问题时能对上号。

改完先别撤,确认这几项。连续三天日志条数和报表的差值收敛到 2% 以内,跨零点的请求也能对上。

补一句。切割本身不丢数据,丢的是统计脚本的读取范围,出报表前先核对文件清单。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189