排查抓取问题时,很多人第一反应是翻日志:“这篇内容上午十点发的,为什么蜘蛛下午才来?”结果打开日志一看,蜘蛛明明是上午十点零五分就抓了。这种对不上账的情况,多半不是蜘蛛慢,而是两边用的时间基准根本不是一回事。
时间错位通常来自哪几层
同一台机器上,时间可能同时存在好几套口径,排查时容易混在一起看:
- 系统层:服务器本地时区是 Asia/Shanghai,但程序输出日志时用了 UTC,两者差八小时。
- 容器层:宿主机改了时区,容器镜像默认仍是 UTC,应用日志和系统日志各说各话。
- 边缘层:CDN 或反向代理产出的访问日志通常统一为 UTC,和源站日志拼在一起就会错位。
- 应用层:发布时间的字段只存了一个本地时间字符串,没有时区标识,换了服务器就变味。
- 分析层:日志采集入库时做了一次时区转换,查询界面又转了一次,等于平移了两遍。
这五层里任何一层没对齐,最后得到的“蜘蛛访问时间”都不可信。
一份可以照着做的校对清单
- 先看系统时间与时区:执行 timedatectl 或 date -R,确认时区和当前时间是否符合预期,而不是只看“日期对不对”。
- 确认时间同步服务在跑:chrony 或 ntpd 是否处于同步状态,偏移量有多大。时钟漂移几分钟,在跨天统计里就会被放大成“蜘蛛一整天没来”。
- 检查容器与宿主机的时区是否一致:容器里单独执行一次 date,别想当然。
- 统一日志时间格式:推荐 ISO 8601 带时区偏移,例如带 +08:00 或 Z 的写法,让读日志的人不用猜。
- 确认 CDN、WAF、负载均衡的日志时区,并在合并分析前明确标注。多数平台默认 UTC,这一点值得写在内部文档里。
- 检查内容管理系统里的发布时间字段:是本地时间还是 UTC,是字符串还是时间戳,导出时有没有带上时区。
- 用一次已知的访问做交叉验证:手动打开一个页面,然后在源站日志和 CDN 日志里分别找这条记录,看时间是否一致。
为什么值得专门花时间做这件事
抓取日志是判断站点状态的重要输入,一旦时间基准有偏差,后续判断都会跟着歪。比如你想确认“内容更新后多久会被重新抓取”,算出来是六小时,实际可能只是一小时;比如你想看蜘蛛的访问是否集中在某个时段,时区一错,窗口就整体平移;再比如把日志和搜索后台的报表放在一起对照,时间对不上,很容易得出错误的结论,然后去改一些本来没问题的地方。
对多机房、多 CDN 节点、多容器的站点来说,这个问题更明显:每条日志都可能来自不同的时间口径,不统一就等于没有统一的时间轴。
一个简单可行的统一方案
不必追求一步到位,可以按下面这个顺序收敛:
- 全链路以 UTC 存储,数据库、日志、消息队列都存 UTC。
- 只在展示层转换成本地时间,转换规则写进代码而不是靠人工心算。
- 日志格式固定为带时区的 ISO 8601,避免同一份日志里混着两种写法。
- 把时区约定写进开发规范和上线检查项,新服务接入时默认遵循。
这样做的好处是,任何一条日志拿出来都能单独解释清楚,不需要先问“这是哪个机器、哪个时区输出的”。
多久复查一次
建议把时间校对放进常规巡检:服务器迁移、容器基础镜像更换、接入新 CDN、调整日志采集链路之后,都顺手确认一次。日常可以每季度抽查一遍同步状态和偏移量,成本很低,但能省掉很多“看起来很诡异的抓取异常”。
时间对不上,讨论的就不是抓取快慢,而是两份不可比的数据。先把时间轴对齐,再谈效率。