先给有条件的结论:如果两边日志记录的都是同一台机器上的同一请求,那么时区设置与时间戳精度差异通常足以解释几秒到几小时的偏移;但如果偏移方向不稳定、同一URL在两边出现次数也对不上,就不要再当作时钟问题处理,而应怀疑日志写入链路本身。对齐事件的目标不是把两个时间改到一样,而是判断某次抓取究竟有没有到达应用层。
抓取日志里的时间,可能是请求进入连接层的时刻,也可能是响应写回后的记录时刻;应用日志里的时间,可能是请求进入业务代码的时刻,也可能是写库或写缓冲的时刻。两者相差几十毫秒到几秒都属正常,因为中间隔着反向代理、连接池、队列和异步写入。
真正需要先核对的是三件事:
如果偏移量固定、方向一致,先修时区和精度,再谈对齐。如果偏移量随机跳动,说明问题不在显示格式。
把同一时间窗口内的记录按URL和方法配对,观察三个信号:
这里有一个会使结论失效的反例:如果应用日志经过采样或按级别过滤,那么“抓取日志有、应用日志无”完全可能是采样丢弃造成的,与拦截无关。此时即使你把时间对齐得再准,也推不出抓取被阻断的结论。判断方法是临时提高该路径的日志级别或关闭采样,观察缺失记录是否补回;若补回,前面的拦截假设就不成立。
假设抓取日志显示某URL在10:00:00被请求,应用日志显示同一URL在10:00:07写入,且过去一小时所有请求都稳定相差约7秒。可以先假设这是链路延迟而非丢失,动作是把该路径的应用日志时间戳改为在请求入口处记录,而不是在写库处记录。改完后若差值缩小到毫秒级,说明此前只是记录点靠后;若差值不变,则延迟发生在更靠前的代理或队列,下一步应查前置层日志而不是继续改应用代码。
对齐事件只是手段,真正要回答的是“这次抓取有没有进入应用”。建议按下面的顺序推进:
需要提醒的是,抓取日志里的访问量下降或归零,并不能单独证明抓取被限制;缓存命中、前置层直接返回、日志轮转丢失或采集管道中断都会产生同样现象。只有把时间对齐、记录点统一、采样因素排除之后,剩下的差异才值得归因到抓取行为本身。