先把结论说清楚:当抓取日志与应用日志的时间对不上,不要急着改时区或认定某一方“错了”。更稳妥的做法是先在两条日志里找到同一个可唯一识别的事件,比如同一个死链URL加上同一个响应状态码,然后用这个共同锚点反推两边的时间偏移。缺少完整数据或权限时,至少可以手工抽取一小段样本做这个对齐,但样本对齐只能说明这两段日志之间的相对关系,不能直接推出全站日志都按同一偏移运行,也不能据此断定死链已经被彻底修复。
表面看都是时间对不上,但成因往往不同。第一种是时钟偏移:抓取端和应用端所在机器的系统时间本身有差异,或者一方用了UTC、另一方用了本地时区,导致同一次访问在两边记录的绝对时间不同。第二种是事件语义不同:抓取日志记录的是爬虫发起请求的时刻,应用日志记录的是请求进入业务处理或写库的时刻,中间隔着网络传输、队列排队、反向代理转发,这些环节本身就会产生几十毫秒到数秒的差。
这两种情况的处理方式完全不一样。前者需要统一时间基准,后者需要接受“时间本来就不该完全相等”,转而用可关联的标识去匹配。把它们混在一起,就会出现“改了时区还是对不上”的反复折腾。
区分办法是找一个两边都会记录、且理论上只发生一次的事件。死链修复场景里,最合适的锚点是对某个已知失效URL的那次请求:抓取日志里有这个URL和请求时间,应用日志里也应该有同一条请求路径和它被处理的时刻。
这里的关键证据是“差值是否稳定”,而不是“差值是否为零”。稳定偏移可以校正,不稳定差值只能靠标识关联,不能靠时间戳硬凑。
如果没有服务器时间配置的查看权限,也拿不到完整的原始日志,仍然可以做一件事:选取一个时间窗口,手工导出抓取日志和应用日志中同一URL的记录,按URL分组,比较各自的时间戳序列。具体动作是:挑一个包含已知死链的URL,在两边各找出它出现的全部记录,按时间排序,看两边记录的条数和先后顺序是否一致。
这个动作的结果会直接影响下一步:如果两边条数一致、顺序一致、只是整体平移,那么可以按平移量做临时对齐,再继续分析死链的响应变化;如果条数都不一致,说明有一方漏记或过滤了记录,此时任何基于时间的对齐都不可靠,应该先解决记录完整性问题,而不是继续调时间。这个结论只适用于你抽样的那个窗口和那批URL,不能外推到整站。
假设某站点抓取日志显示某失效URL在10:00:00被请求,应用日志显示同一路径在10:00:07被处理。再抽十条记录,若差值都接近7秒,可以假设存在固定偏移,校正后再看这个URL后续是否仍返回失效状态。若这十条里差值从1秒到40秒不等,就不能用单一偏移校正,而应改用请求ID、URL加时间戳组合去关联,并检查是不是有队列积压。这个例子里的数字只是说明比较方法,不代表任何真实系统的表现。
即使时间对齐成功,也只能说明两边记录的是同一次访问。它不能证明死链已经被修复,因为一次请求返回正常状态,可能只是临时回源成功或命中了缓存;也不能证明搜索引擎已经重新抓取并更新了索引,抓取和应用处理是两回事。另外,robots.txt里的抓取限制不等于可靠的索引移除,站点地图也不保证收录,这些都需要分别核查,不能因为日志对上了就一并下结论。
把时间对齐当成定位问题的起点,而不是修复完成的终点,后续还要结合状态码变化和多次抓取结果来判断,才能决定是否进入下一步处理。