先看现象。日志按天切割,统计脚本只读当天那一段,站长后台的抓取量和抓取统计每天差 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% 以内,跨零点的请求也能对上。
补一句。切割本身不丢数据,丢的是统计脚本的读取范围,出报表前先核对文件清单。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
