先给结论:在绝大多数主域名选择场景里,抓取日志和应用日志的时间不一致,不是“谁错了”,而是两类日志记录的事件不同。抓取日志记录的是爬虫到达边缘节点或源站的时刻,应用日志记录的是请求进入业务处理链路的时刻。两者之间隔着 DNS 解析、CDN 回源、负载均衡排队、TLS 握手和反向代理缓冲。要判断主域名选择是否引发了抓取异常,必须先把同一批请求对齐到同一时间轴上,再比较事件序列,而不是直接比较时间戳差值。
很多对齐失败源于把不同阶段当成同一事件。抓取日志里的时间通常是请求到达接入层的时刻,应用日志里的时间可能是请求被业务框架接收的时刻,也可能是响应写回的时刻。如果应用日志记录的是处理完成时间,那么它与抓取日志之间的差值天然包含处理耗时,这个差值不能用来判断抓取是否被延迟。
可执行的第一步动作:在应用日志中找出请求唯一标识,例如请求 ID、trace ID 或 URL 加时间戳的组合,然后确认抓取日志是否携带同一个标识。如果抓取日志只有 IP、User-Agent 和 URL,没有可传递的请求标识,就需要先判断能否在接入层注入一个标识并透传到应用层。这个动作的结果直接决定后续能否做逐请求对齐:能透传,就按请求对齐;不能透传,就只能按时间窗口做统计对齐。
两份日志的时间不一致,常见原因有三个,需要分别验证,不能混在一起处理。
把两份日志统一到 UTC 之后,再计算同一请求标识下的差值分布。如果差值中位数接近零且尾部很短,说明对齐良好;如果差值出现双峰或长尾,说明中间存在排队或重试,需要继续拆分。
主域名选择本身不会直接改变日志时间,但它会改变请求路径。假设一个场景:站点原先使用 www 作为主域名,后来把裸域设为主域名并做 301 跳转。此时抓取日志中会出现两类请求,一类是爬虫直接请求裸域,一类是请求 www 后被跳转。应用日志中,跳转请求可能只记录最终落地的裸域请求,也可能把跳转本身也记成一次请求。
在这种假设下,对齐时会发现抓取日志的请求数多于应用日志的请求数,且多出来的请求集中在跳转路径上。这不是时间不一致,而是事件计数口径不一致。处理动作是:先按 URL 路径把请求分组,再分别对齐。如果跳转请求在应用日志中缺失,就不能用应用日志的请求量去推断抓取覆盖率。
另一个假设场景:主域名从带 CDN 的域名切换到直连源站的域名。抓取日志记录的是 CDN 边缘节点收到请求的时间,应用日志记录的是源站收到回源请求的时间。两者之间的差值取决于 CDN 缓存命中情况。缓存命中时,应用日志可能完全没有对应记录;缓存未命中时,差值包含回源网络耗时。此时对齐的正确做法是只比较缓存未命中的请求,并在抓取日志中标记哪些请求触发了回源。如果无法标记,就不能用整体时间差判断源站响应是否变慢。
以读者手中一份抓取日志和一份应用日志为对象,可以按以下顺序处理。
完成上述步骤后,如果发现抓取日志时间早于应用日志时间且差值稳定,说明请求在接入层到应用层之间有一段固定延迟,这通常与主域名选择无关,而与网络路径或代理配置有关。如果发现应用日志时间早于抓取日志时间,优先检查时钟同步,而不是怀疑抓取行为异常。
个别样本对齐成功,不代表规模化后仍然成立。以下边界需要明确。
需要强调的是,抓取日志和应用日志的时间对齐只能说明请求在链路中的先后关系,不能单独证明主域名选择是否正确,也不能单独证明索引状态。robots.txt 的抓取限制不等于可靠的索引移除,站点地图不保证收录。对齐工作的价值在于排除时间因素干扰后,让后续判断建立在同一事件口径上。如果对齐后仍然无法解释差异,下一步应检查主域名解析记录和跳转链路,而不是继续调整日志格式。