Java 异常打到容器 stdout,采集端按行合并成一个事件,Kibana 里这条日志的时间是异常第一行的时间,堆栈里打印的业务时间比它晚 4 秒。乍看像缓存或者权限的锅,追下去往往不是。

multiline.pattern: '^\d{4}-\d{2}-\d{2}'
multiline.negate: true
multiline.match: after

追下去是这么回事:合并规则只保留首行的时间字段,后续行的时间被丢弃。业务日志里的时间写在正文,没有单独抽成字段。

「多行日志时间戳」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

具体做法是,在日志格式里把时间放到每行开头 便于解析;多行合并时用首行时间作为事件时间 正文保留原始时间;需要精确排序的场景 把业务时间抽成独立字段;用一条跨秒的异常验证时间落点。

验收就看一点,异常事件的时间与首行时间一致 正文里的业务时间也能单独筛。

作者 9823189