在 Ubuntu 上使用 Filebeat 进行多行日志合并(multiline),通常是在 filebeat.yml 中通过 multiline 配置 来实现的。下面按常见场景给你说明。
编辑 Filebeat 配置文件(通常是):
sudo vi /etc/filebeat/filebeat.yml
在 filebeat.inputs 里针对具体日志做配置,例如:
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/app/*.log
multiline:
pattern: '^\['
negate: true
match: after
例如日志格式:
2024-01-01 10:00:00 INFO starting
stack trace line 1
stack trace line 2
2024-01-01 10:00:01 ERROR failed
配置:
multiline:
pattern: '^\d{4}-\d{2}-\d{2}'
negate: true
match: after
含义:
pattern:新日志行开头negate: true:不匹配 pattern 的行合并到上一行match: after:合并到“前一行”后面multiline:
pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
negate: true
match: after
或按异常关键字:
multiline:
pattern: '^(ERROR|WARN|INFO)'
negate: true
match: after
multiline:
pattern: '^Traceback \(most recent call last\)'
negate: false
match: after
例如:
line1 \
line2 \
line3
multiline:
pattern: '\\$'
negate: false
match: before
| 参数 | 说明 |
|---|---|
pattern |
正则表达式,决定“新日志开始” |
negate |
true:非匹配行合并;false:匹配行合并 |
match |
after(合并到前一行)或 before(合并到后一行) |
max_lines |
最大合并行数(默认 500) |
timeout |
超时强制发送(默认 5s) |
示例:
multiline:
pattern: '^\['
negate: true
match: after
max_lines: 1000
timeout: 10s
filebeat test config
sudo systemctl restart filebeat
sudo systemctl status filebeat
✅ Filebeat 7+ 推荐用 type: log
✅ 多行配置只对新采集的日志生效(旧日志不会重排)
✅ 如果用了 Kafka / Logstash,确保下游没有再次拆分
如果你能提供具体日志样例(如 Java / Nginx / 自定义格式),我可以直接帮你写一份可用的 multiline 配置。