Kibana 里一次异常被拆成四十多条文档,堆栈每一行单独一条,按 traceId 聚合时要把它们重新拼回去,看得很费劲。日志里能对上时间点,这种反而好排。

采集端没开多行模式,逐行发送,堆栈里的 at 行没有独立时间戳,被当成一条新日志,文件里的结构信息在采集这一步就丢了。这一点先确认清楚,后面就不用反复试。

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

这次卡住的地方就在「多行日志合并」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

报错里带路径的,先去看那个路径在不在、权限对不对。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

处理上按这个顺序:在 input 里加 multiline 用时间戳开头作为新事件标志;pattern 匹配 yyyy-MM-dd 这种行首;改完清掉 positions 再重新采这一段。

结果对不对很好判断,再触发一次异常,Kibana 里只多出一条包含完整堆栈的文档。

作者 9823189