在 CentOS 上配置 Filebeat 多行日志(multiline),核心是在 filebeat.yml 中针对具体的 input 配置 multiline.pattern、multiline.match 等参数。下面按常见场景给你说明。
例如日志格式如下:
2024-01-01 10:00:00 ERROR Exception in thread "main"
java.lang.NullPointerException
at com.xxx.Test.main(Test.java:10)
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/app/*.log
multiline.pattern: '^\d{4}-\d{2}-\d{2}'
multiline.negate: true
multiline.match: after
multiline.timeout: 5s
multiline.patternmultiline.negate
true:不匹配 pattern 的行,合并到上一行false:匹配 pattern 的行合并multiline.match
after:把后续行追加到前面before:把后续行放到前面multiline.timeout
超过时间强制发送,防止一直等待multiline.pattern: '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}'
multiline.negate: true
multiline.match: after
[ 或线程名开头)multiline.pattern: '^\['
multiline.negate: true
multiline.match: after
{ 开头的 JSON 日志multiline.pattern: '^\{'
multiline.negate: true
multiline.match: after
multiline.pattern: '^[[:space:]]'
multiline.negate: false
multiline.match: after
如果是 Docker 日志:
filebeat.inputs:
- type: container
paths:
- /var/lib/docker/containers/*/*.log
multiline.pattern: '^\d{4}-\d{2}-\d{2}'
multiline.negate: true
multiline.match: after
# 校验配置
filebeat test config
# 重启 filebeat
systemctl restart filebeat
# 查看状态
systemctl status filebeat
# 查看日志
journalctl -u filebeat -f
filebeat -e -c filebeat.yml
可以直接在前台运行,看是否合并正确。
如果你能贴一段真实日志样例,我可以直接帮你写精确的多行正则配置。