Filebeat多行匹配模式含动态空格时失效问题排查
JVM GC日志合并问题(Filebeat多线配置失效排查)
需求
将同一GC(n)的日志条目合并为单条消息,例如GC(0)的三行日志需合并为一条完整的GC事件记录。
原始GC日志
[2024-10-16T00:53:05.165+0000][6.308s][gc,heap] GC(0) Metaspace used 12167K, committed 12480K, reserved 1114112K [2024-10-16T00:53:05.165+0000][6.308s][gc,heap] GC(0) class space used 1260K, committed 1408K, reserved 1048576K [2024-10-16T00:53:05.165+0000][6.308s][gc ] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 51M->10M(1032M) 12.441ms [2024-10-16T00:53:05.165+0000][6.308s][gc,heap] GC(1) Metaspace used 12167K, committed 12480K, reserved 1114112K [2024-10-16T00:53:05.165+0000][6.308s][gc,heap] GC(1) class space used 1260K, committed 1408K, reserved 1048576K [2024-10-16T00:53:05.165+0000][6.308s][gc ] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 51M->10M(1032M) 12.441ms [2024-10-16T00:53:05.165+0000][6.308s][gc,heap] GC(2) Metaspace used 12167K, committed 12480K, reserved 1114112K [2024-10-16T00:53:05.165+0000][6.308s][gc,heap] GC(2) class space used 1260K, committed 1408K, reserved 1048576K [2024-10-16T00:53:05.165+0000][6.308s][gc ] GC(2) Pause Full (System.gc()) 3531M->2934M(7696M) 3796.534ms
失效的Filebeat配置
filebeat.inputs: - type: log enabled: true paths: - "/opt/micro_service/TA/MOUNT/gc_logs/s1gc3.log" multiline.pattern: '^\[gc[[:space:]]\](.)*?' multiline.negate: true multiline.match: before
问题原因分析
- 正则匹配精度不足:
原配置中[[:space:]]仅匹配单个空格,但日志里[gc ]包含5个连续空格,导致正则无法识别GC组的结尾行,所有行都被判定为“不匹配”,无法触发正确的分组逻辑。 - 合并逻辑倒置:
使用match: before会将不匹配的行追加到前一行的前面,既打乱了日志原有顺序,还会导致所有行被合并成一个无意义的大区块,而非按GC(n)拆分。
修正后的配置
以下配置可实现按GC(n)分组合并的需求,核心是正确识别GC组的结尾行,并将前置行合并到结尾行中:
filebeat.inputs: - type: log enabled: true paths: - "/opt/micro_service/TA/MOUNT/gc_logs/s1gc3.log" # 匹配以[gc + 任意数量空格 + ]开头的行(GC组的结尾行) multiline.pattern: '^\[gc\s+\]' # 取反:匹配所有非结尾行的日志 multiline.negate: true # 将非结尾行合并到后续的结尾行中,形成完整GC事件 multiline.match: after
如果需要严格匹配日志中的5个空格,可将\s+替换为\s{5}:
multiline.pattern: '^\[gc\s{5}\]'
内容的提问来源于stack exchange,提问作者Bhanu Praveen
相关产品推荐
相关产品推荐

