先把结论说清:抓取日志与应用日志的时间戳通常来自两台机器或两套时钟,直接按秒比对没有意义。正确做法是先判断你手上有没有可用的请求唯一标识;有则按标识匹配,没有则退回到“分钟级窗口+URL+状态码”的近似对齐,并且只把对齐结果当作线索,不当作收录结论。
两种条件决定完全不同的操作路径,选错会白做。
判断依据很简单:取任意一条抓取记录,看它的标识能否在应用日志中检索到。检索不到,就归入条件B,不要试图靠时间戳硬凑。
当标识可用时,动作是:以抓取日志中的标识为起点,在应用日志中检索同一标识,取回应用侧的开始时间与结束时间。两端的绝对时间差可以记录,但不要用它判断对错——它反映的是时钟偏移,不是处理延迟。
真正有信息量的是应用侧开始到结束的耗时,以及抓取侧记录的状态码与应用侧返回的状态码是否一致。如果不一致,说明中间还有一层(缓存、代理、CDN)改写了响应,这一步会直接决定你下一步该去查哪一层,而不是继续在两份日志里找时间差。
缺少标识时,可执行的最小动作是:把抓取日志按分钟分桶,统计每个URL在该分钟内的请求次数与状态码分布;再对应用日志做同样的分桶。然后只比较同一URL在同一分钟内的次数与状态码分布,不比较具体某一条。
这样做能回答一个有限的问题:某个URL的请求是否在同一时间段内到达了应用。它不能回答“这一条抓取对应哪一条应用记录”。如果两边的次数对不上,合理解释至少有三种:中间层缓存拦截了部分请求、应用日志采样或轮转丢了一部分、抓取日志里混入了非目标来源的请求。这三种原因需要分别验证,不能只看次数差就下结论。
假设抓取日志显示某URL在10:03有12次请求,应用日志同分钟只有5次。若该URL经过CDN且缓存命中率较高,差额可能来自缓存直接响应,请求根本没到应用。此时下一步应是查CDN侧的访问记录,而不是修改应用代码。这个例子的数字仅用于说明比较方法,不代表任何真实站点的表现。
即便两边事件成功对齐,也只能说明“抓取请求到达了应用并得到了响应”。它推不出页面已被索引,也推不出外链已被计入可见结果。收录与否取决于后续处理,而抓取日志和应用日志都不覆盖那一步。
另外要留意:robots.txt 中的限制只影响抓取行为,不等于可靠的索引移除手段;站点地图存在也不保证收录。若你的目标是判断可见性,对齐日志只是排查链条的前半段。
如果拿不到应用日志,仍可执行的最小动作是:只保留抓取日志,按URL聚合状态码与频次,标出持续返回非200的条目,再针对这些条目单独确认响应来源。这个动作能缩小范围,但无法区分“应用返回”与“中间层返回”。
例外情况:当URL带有时效性参数或每次请求都不同时,按URL聚合会失效,此时只能退回到按路径前缀聚合,并接受精度下降。精度下降意味着结论更弱,需要更多旁证才能支撑判断。