多行日志合并是什么
Java 堆栈、Python 回溯、JSON 格式化输出天然是多行的,如果不做合并,日志系统会把每一行当成独立事件,堆栈被拆成几十条互不相关的记录,检索时既看不到完整上下文,也统计不准错误次数。multiline 通过正则判断某一行是「新事件的开始」还是「上一事件的续行」,把多行合成一条事件后再发送。
基本信息
| 适用平台 | Filebeat 7.x / 8.x,输入配置中的 multiline 选项 |
|---|---|
| 三个关键参数 | pattern(正则)、negate(是否取反)、match(after 或 before) |
| 两种主流写法 | 续行特征判断,或新事件起点判断 |
| 注意事项 | 合并会引入等待,涉及超时与最大行数参数 |
典型使用场景
- Java 应用:把异常堆栈合并成一条,保留完整调用链
- Python 服务:回溯信息跨行输出时避免被拆散
- JSON 美化输出:多行格式化的请求日志合并成单条
- 自定义格式:按时间戳开头的行作为事件边界
- 排查统计:合并后错误次数的统计口径才准确
两种常用规则
两种常用规则
# 规则一:以空白开头的行并入上一行(续行特征)
# multiline.pattern: '^[[:space:]]'
# multiline.negate: false
# multiline.match: after
# 规则二:以时间戳开头的行是新事件起点,其余行并入前一行
# multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
# multiline.negate: true
# multiline.match: after
# 加载与验证:
# filebeat test config -c filebeat.yml
# filebeat -e -c filebeat.yml # 前台运行观察解析结果参数组合与效果
| 参数 | 取值 | 含义 |
|---|---|---|
| pattern | 正则表达式 | 用于识别行特征的匹配规则 |
| negate | false | 匹配的行按 match 方向处理 |
| negate | true | 不匹配的行按 match 方向处理 |
| match | after | 追加到上一行之后,最常用 |
| max_lines | 数值上限 | 防止单条事件无限增长 |
两种写法各有适用面:续行特征简单可靠,新事件起点写法对自定义格式更通用,但在多线程写同一个文件的场景下要先在小样本上验证。
合并会在内存中暂存直到判定结束,涉及等待超时与最大行数;实时性要求高的日志要评估这部分延迟,避免单条事件长期不发送。