问题出现得很突然,日志倒是留得挺全。排查抓取高峰时发现源站日志的时间比 GSC 报表早 8 小时,同一批请求在两边落在了不同的日期,按天统计怎么算都对不上。

刚开始盯着「日志切割脚本按本地时间切,跨天的那一小时被分到两个文件」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。Nginx 默认按系统时区写日志,容器里通常是 UTC。另一种情况是GSC 报表按账号时区展示,默认是太平洋时间。

另外,监控面板取的是 UTC,报表导出又是东八区。

动手时先确认服务器与日志的实际时区

date -u; date; head -1 access.log | cut -c1-20

接着把日志时间统一成本地时区

log_format main '$time_local ...'; # 并设置 env TZ=Asia/Shanghai

再往下按同一时区重算抓取量

TZ=Asia/Shanghai awk '{print $4}' access.log | cut -c14-15 | sort | uniq -c

末了核对切割文件的边界

ls -l access.log-20261110* | head

改完先别撤,确认这几项。统一时区后,日志与报表的日抓取量差异从 30% 降到 3% 以内,抓取高峰的时间点也能对上。

这里还有个坑。跨时区排查最容易得出错误结论,先确认每个数据源用的是哪个时区,比反复重算更省时间。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189