先给结论:不要直接把两份日志的时间戳相减,也不要默认哪一份“错了”。正确做法是先把两份日志各自的时间语义写清楚,再用一个已知的、发生在同一时刻的事件作为锚点,算出稳定的偏移量,最后用这个偏移量去对齐其他事件。只有当偏移量在同一台主机、同一时间段内保持稳定,跨日志对齐才成立;如果偏移量本身在漂移,说明两份日志记录的根本不是同一个时间基准。
抓取日志通常记录的是请求到达边缘节点或负载均衡的时刻,应用日志记录的往往是请求进入业务进程、开始处理或写入完成的时刻。这两个时间点天然不同,中间隔着排队、连接复用、反向代理转发、进程调度。如果只看时间戳,很容易把“请求到达”和“请求被处理”当成同一件事,从而得出“抓取量突然归零”或“某个页面从未被抓”这类与直觉相反的结论。
更麻烦的是时间格式本身。有的日志写的是本地时间且不带时区,有的写 UTC,有的只精确到秒,有的带毫秒。两份日志如果时区标注不一致,差值可能正好是整小时,看起来像“抓取集中在某个整点”,实际只是时区错位。
解释一:两份日志用的是同一个时钟,差值来自处理链路本身的耗时。这种情况下偏移量应该比较小,通常在毫秒到秒级,且在同一路径上相对稳定。
解释二:两份日志用的是不同时间基准,比如一台主机没同步时间,或者一份日志按 UTC 写、另一份按本地时间写。这种情况下偏移量往往是整分钟、整小时这类“整齐”的数值,并且在一段时间内几乎不变。
区分两者的证据不是看单条记录,而是看分布:
找一个你能在两份日志里同时确认的事件。假设你在应用日志里看到一次部署重启,记录为 2024-06-01T08:00:00Z;同时抓取日志在重启期间出现了一段明显的请求中断,中断起点记为 2024-06-01 16:00:00(未标时区)。这两个时刻指向同一件事,差值正好是 8 小时,且是整小时,那么更合理的判断是抓取日志写的是本地时间,而应用日志写的是 UTC。
这个例子是假设的,目的是说明比较方法:用同一事件的两个记录相减,而不是用两条无关记录相减。得到偏移量后,把它应用到抓取日志上,再去看“某天抓取量下降”是否仍然成立。如果对齐后下降消失了,原来的结论就是时间错位造成的假象;如果对齐后下降依然存在,才需要继续查抓取行为本身。
算出偏移量只是第一步,还要验证它是否稳定。具体动作是:在至少两个不同时间段各取一个锚点事件,分别算偏移量。如果两次结果一致,就可以用这个偏移量批量对齐;如果两次结果不一致,说明时间基准在变化,此时不应该做全局对齐,而应该先修时钟同步,再重新取数。
验证时还要注意日志精度。抓取日志只到秒、应用日志到毫秒时,对齐后的误差最多是 1 秒,判断“先后顺序”可以,判断“间隔多少毫秒”不可靠。这种情况下,把结论限定在秒级,不要用毫秒差去推断性能问题。
抓取量或请求量在某段时间归零,不能单独证明抓取被阻止或页面被移除。它也可能是日志轮转、采集管道中断、时区错位把数据挪到了相邻时段,或者过滤规则把记录丢掉了。同理,站点地图里列出了某个地址,不代表它一定被收录;robots.txt 里写了限制,也不等于可靠的索引移除手段。这些都需要分别核查,而不是靠单一现象下结论。
对齐日志的价值在于:它让你在排查“抓取是否正常”时,先把时间这个变量固定住。时间基准没对齐之前,任何基于时间差的推断都不可靠。对齐之后,你得到的偏移量和稳定性结论,会直接决定下一步是去查时钟同步,还是去查抓取路径和响应状态。