先给结论:多数情况下应以应用日志里“页面被请求并返回200”的那条记录作为事件锚点,再用抓取日志的同一URL、同一UA、相邻时间窗去匹配;只有当抓取日志能提供应用日志缺失的请求阶段信息(如被拒绝、超时、重定向链)时,才反过来以抓取日志为主。两者时间不一致本身不构成故障证据,关键是先判断差异来自时钟、时区还是处理链路,再决定下一步查什么。
抓取日志与应用日志的时间戳不一致,常见来源有三类,处理方式完全不同。
判断方法:抽10到20条同一URL的记录,算时间差的分布。差值集中在一个常数附近,偏向时钟或时区;差值离散且与访问高峰相关,偏向链路延迟。
做法一:以应用日志时间为准,把抓取日志按URL和UA挂靠过去。成立条件是应用日志能稳定记录请求到达时间、状态码和响应体大小,且抓取UA没有被中间层改写。代价是你会丢失“请求在到达应用之前发生了什么”,比如被WAF拦截、被负载均衡重试,这些在应用日志里根本不会出现。
做法二:以抓取日志时间为准,把应用日志视为其下游。成立条件是抓取日志包含完整的请求行、状态码和响应字节数,且你能确认它记录的是响应完成时刻。代价是当抓取日志只记录发起时刻时,会把慢响应的页面误判为“已正常抓取”,从而掩盖真实的超时问题。
选择依据可以简化成一句:要查“百度有没有来”,用抓取日志;要查“来了之后服务端怎么处理的”,用应用日志。两者时间不一致时,先固定其中一份的语义,再去另一份里找对应事件,而不是强行让两边时间戳相等。
如果站点前面有CDN或反向代理,并且它自己对抓取请求做了缓存命中或合并回源,那么应用日志里可能只有一次回源记录,而抓取日志里对应多次请求。此时无论以哪份日志为准,按URL一对一匹配都会失败:应用侧一条记录会对应抓取侧多条,时间差也不再是稳定偏移。
识别信号是:同一URL在抓取日志里短时间内出现多次,应用日志里只有一次,且应用日志的响应时间明显偏长。遇到这种情况,对齐单位要从“单次请求”改成“时间窗内的请求计数”,先确认缓存层是否合并了回源,再判断收录相关行为。否则你会把缓存层的正常合并误读成抓取异常。
假设一个场景:某栏目页在抓取日志里显示当天有多次请求,应用日志里只出现一次200,时间差约40秒,且集中在访问高峰。按上面的步骤,先排除时钟和时区,再把匹配单位换成时间窗计数,结果指向缓存合并回源。下一步动作应是核对缓存层的回源策略,而不是给页面加内链或改标题。这个推断成立的前提是两份日志都覆盖了同一UA且没有被采样截断;如果日志本身经过采样,上面的计数对比就不成立,需要先恢复完整日志再判断。
对齐的目的不是让两份日志时间相等,而是确定事件发生在链路的哪一段。若差异来自时钟或时区,修正解析口径后重新观察即可,不需要改站点。若差异来自链路延迟,重点转向响应时间和中间层配置。若出现一对多的请求关系,先查缓存与重试,再谈收录表现。只有当你确认请求已正常到达应用并返回成功状态,却仍看不到预期的抓取变化时,才值得去检查内容质量和站点结构层面的问题。