在 CentOS 上使用 Filebeat 做多行日志(multiline)处理,核心是在 filebeat.yml 中配置 multiline 参数。下面按常见场景给你说明。
编辑 Filebeat 配置文件(通常路径):
/etc/filebeat/filebeat.yml
在 filebeat.inputs 里添加 multiline 配置,例如:
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/app/*.log
multiline:
pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
negate: true
match: after
正则表达式,用来识别“新日志行的开始”
示例:
'^[0-9]{4}-[0-9]{2}-[0-9]{2}''^\d{2}:\d{2}:\d{2}'[ 开头:'^\['true:不匹配 pattern 的行,合并到上一行false:匹配 pattern 的行,合并到上一行✅ 最常见用法是 negate: true
after:把后续行追加到上一行后面before:把后续行放到下一行前面一般使用:
match: after
multiline:
pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}'
negate: true
match: after
效果:
2024-01-01 10:00:00 ERROR ...
java.lang.NullPointerException
at com.xxx.Test.main(Test.java:10)
→ 合并为一条事件
[ 开头的日志multiline:
pattern: '^\['
negate: true
match: after
multiline:
pattern: '^\d{4}/\d{2}/\d{2}'
negate: true
match: after
filebeat.inputs:
- type: log
paths:
- /var/log/java/*.log
multiline:
pattern: '^[0-9]{4}-'
negate: true
match: after
- type: log
paths:
- /var/log/nginx/*.log
multiline:
pattern: '^\d{2}/'
negate: true
match: after
# 测试配置
filebeat test config
# 前台运行(调试)
filebeat -e -c /etc/filebeat/filebeat.yml
rm -f /var/lib/filebeat/registry/*
systemctl restart filebeat
如果你能贴出具体日志格式(例如 Java / Python / Nginx),我可以帮你写精准的 multiline 正则。