先给结论:不要用“时间戳对不上”直接推断抓取失败或收录异常,而要先判断两条日志记录的是不是同一类事件。抓取日志通常记录请求到达服务器的时刻,应用日志可能记录请求进入业务处理、响应写出或异步落库的时刻。两者相差几秒到几分钟都可能是正常的;真正需要对齐的是同一次请求的标识,而不是两个钟表读数。
假设你在排查一个页面为什么长期没有被搜狗收录提交后正常处理,翻服务器日志时看到:抓取日志显示某次访问发生在10:02:11,应用日志里对应记录却是10:07:40。直觉上会怀疑服务器时钟漂移,或者怀疑抓取根本没打到应用层。但这两个结论都可能过早。
更常见的情况是:抓取日志来自反向代理或Web服务器,应用日志来自框架中间件。请求先被代理接收,再排队、等待连接池、等待锁,最后才进入应用。中间隔了五分钟,说明瓶颈在进入应用之前,而不是应用处理本身。反过来,如果应用日志时间早于抓取日志,那多半是两条日志用了不同时区,或者应用侧记录了请求发起时间而非接收时间。
把差异归因,先分成两类,才能决定下一步查什么。
两种解释对应的动作完全不同。时钟问题只需要校准时间源,链路问题则需要看请求在哪个环节被拖延。如果搞反了,你会花时间调NTP,却对真正的排队问题毫无帮助。
最有效的证据是给同一次请求打上唯一标识,而不是继续比对时间戳。具体做法:在Web服务器或代理层生成一个请求ID,通过请求头透传到应用,应用日志里也记录这个ID。之后按ID检索,而不是按时间范围检索。
拿到带ID的日志后,看三个点:
一个假设例子:某站点在代理层加了请求ID,发现应用接收时间普遍比代理接收时间晚0.3秒,但某个栏目页晚6秒。进一步看,该栏目页在应用入口处有一次同步的外部查询。这说明延迟来自那次查询,而不是时钟。此时把查询改为异步或加缓存,再观察应用接收时间是否回落,就能验证判断。这个动作的结果会直接决定你是继续查时间同步,还是转向优化入口逻辑。
有两种常见做法,各有适用条件。
做法一:统一时间源,只比对时间戳。适合日志量小、链路简单、没有异步处理的站点。代价是遇到排队或异步任务时,时间戳本身无法说明请求经历了什么,容易把链路延迟误判为时钟问题。
做法二:引入请求ID,按事件链对齐。适合有代理、队列、异步任务的站点。代价是需要改动日志格式和透传逻辑,短期增加维护成本。但它能把“时间对不上”转化为“请求在哪一段停留”,这是时间戳比对做不到的。
选择条件可以这样判断:如果两条日志的差异总是在同一台机器上表现为固定偏移,先做时间源校准;如果差异随负载变化、只在部分URL上出现,直接上请求ID,不要先动时钟。
在搜狗收录提交的排查中,抓取日志和应用日志不一致时,先确认这次访问是否真的来自搜狗,而不是其他爬虫或用户访问。用User-Agent和反向DNS只能作为线索,不能单独作为结论,因为UA可以伪造。
确认来源后,按下面的顺序做:
需要提醒的是,robots.txt的抓取限制不等于可靠的索引移除,站点地图也不保证收录。这些和日志时间对齐是两件事,不要因为日志对不上就顺手改robots或重新提交站点地图,那会把排查方向带偏。
最后,抓取量或提交量归零也不能单独证明你的处理正确。它可能来自抓取配额调整、页面质量变化、服务器暂时不可达,或者只是抓取周期还没到。把请求ID对齐后的事件链作为主要依据,时间戳只作为辅助线索,才能避免在错误的方向上反复调整配置。