一条下单请求的日志在文件里顺序是 10:02、10:01、10:03,grep 出来像先成功后失败又成功,实际只发生了一次。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

TZ=Asia/Shanghai java -Duser.timezone=Asia/Shanghai -jar app.jar
logger.info("ts={}", OffsetDateTime.now());

应用日志用 UTC 时间,网关和容器用本地时间,采集端按各自时区解析后统一存 UTC,前后相差 8 小时。按写入顺序看又是对的,混在一起就乱了。这一点先确认清楚,后面就不用反复试。

「日志时区不一致」这类改动最怕改一半,回滚脚本先准备好,再动生产。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

具体做法是,所有组件统一用带时区的 ISO8601 格式;容器挂载 TZ 并把 JVM 的 user.timezone 设成一致;采集端显式声明时区 不要按本地推断;用同一请求的 traceId 串起来核对时间顺序。

改完照着核一遍,同一 traceId 的日志时间单调递增 与网关日志对得上。

作者 9823189