Filebeat技术之多行采集
权威发布:Manage multiline messages | Elastic Documentation
一、Filebeat 多行采集是什么
Filebeat 本身是一个轻量级日志采集器,默认情况下它按行(line)读取日志文件,并将每一行作为单独的事件发送到下游(如 Elasticsearch、Logstash 等)。但在实际生产环境中,经常会遇到“一个日志事件跨多行”的场景,比如:
-
Java 应用的异常堆栈(stack trace)往往占用多行:
2025-06-03 10:15:22,123 ERROR com.example.MyService - 执行失败 java.lang.NullPointerException: ... at com.example.MyService.doWork(MyService.java:42) at com.example.App.main(App.java:10)
-
某些脚本输出会把一条业务日志分成多行输出,例如带有换行符的 JSON、YAML 或者自定义格式的日志。
-
当日志输出包含堆栈信息、调试信息或多行描述时,如果不做多行合并,ELK(或 EFK)下游就会把同一个异常拆成多条记录,导致查询和关联非常混乱。
Filebeat 的多行采集(multiline)功能,就是用来“把同一个逻辑事件跨多行的日志,合并成一个完整事件发送”的机制。它通过正则规则判断“当前读取行是否属于上一事件的延续”,如果是则合并,否则开始一个新事件。
二、为什么要用到多行采集
-
1. 保持日志完整性,方便问题定位
-
如果一个 Java 异常堆栈分散在 10 行里,而 Filebeat 默认逐行发送,ES/Kibana 中会把这 10 行当成 10 条日志分别索引,后面查找异常时就无法一次性看到完整堆栈。
-
多行采集让我们在 Filebeat 端就把这 10 行合并成 1 条完整记录,这样在 Kibana 中检索、聚合、关联时就能一次性看到整个堆栈,极大提升排错效率。
-
-
2. 减轻下游处理压力
-
如果不做多行合并,需要依赖 Logstash 或者 Ingest Pipeline 去做“多行合并”或“事件聚合”,相对复杂,还会增加延迟。Filebeat 多行采集是在采集端完成合并,发送到 Elasticsearch 时已经是一条完整事件,更轻量高效。
-
倘若日志源端已经分好行,但下游只关心“整条消息”,Filebeat 级别就做合并能减少网络、IO 和 Elasticsearch 索引的总体负载。
-
-
3. 适应常见应用输出格式
-
许多主流框架(如 Log4j、Logback、Spring Boot 等)输出异常或某些调试信息时,都会将同一次异常的多行堆栈分为多行打印。Filebeat 多行功能可以无缝兼容这些格式。
-
如果你有自己定义的日志格式(比如自定义脚本在多行写入一条业务描述),也能够通过正则将它们合并为一条事件。
-
总之,多行采集能保证“一条业务/异常”对应“一条事件”,而不是“N 条事件”。
三、如何做到多行采集
Filebeat 的多行采集是在配置文件中通过 multiline
选项来实现的。常见配置步骤如下:
-
打开 Filebeat 配置文件
-
默认位置:
/etc/filebeat/filebeat.yml
-
或者在自定义 modular 配置目录下(例如
/etc/filebeat/modules.d/
或/etc/filebeat/config.d/
中对应的文件)。
-
-
在对应的 input/Prospector 区块下,开启 multiline 配置
以下举例说明几种常用场景的配置方式。
1.Filebeat模块多行采集Redis集群日志
要保证机器上面有Redis服务哦,没有的话直接install安装一下。
2. 启动filebeat实例
[root@elk93 ~]# cat /tmp/modules-redis-to-es.yaml
filebeat.config.modules:path: ${path.config}/modules.d/redis.ymlreload.enabled: trueoutput.elasticsearch:hosts:- 10.0.0.91:9200- 10.0.0.92:9200- 10.0.0.93:9200index: novacao-linux95-modules-redis-%{+yyyy.MM.dd}
setup.ilm.enabled: false
setup.template.name: "novacao-linux95"
setup.template.pattern: "novacao-linux95-*"
setup.template.overwrite: true
setup.template.settings:index.number_of_shards: 5index.number_of_replicas: 0
[root@elk93 ~]#
[root@elk93 ~]#
[root@elk93 ~]# filebeat -e -c /tmp/modules-redis-to-es.yaml
3. filebeat启用Redis模块
[root@elk93 ~]# filebeat modules enable redis
Enabled redis
[root@elk93 ~]#
4. 编写filebeat采集Redis多行配置
- filebeat采集redis启动日志多行合并案例
[root@elk93 filebeat]# cat 11-filestream-multiline-redis-to-es.yaml
filebeat.inputs:
- type: filestreampaths:- /var/log/redis/redis-server.log*# 配置解析器parsers:# 定义多行匹配- multiline:# 指定匹配的类型type: pattern# 定义匹配模式pattern: '^\d'# 参考官网: https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.htmlnegate: truematch: after#output.console:
# pretty: true
output.elasticsearch:hosts:- 10.0.0.91:9200- 10.0.0.92:9200- 10.0.0.93:9200index: linux95-modules-redis-%{+yyyy.MM.dd}setup.ilm.enabled: false
setup.template.name: "linux95"
setup.template.pattern: "linux95-*"
[root@elk93 filebeat]#
5. 多行匹配采集tomcat错误日志
filebeat的多行匹配采集tomcat错误日志
1.准备tomcat错误日志
[root@elk93 ~]# shutdown.sh
Using CATALINA_BASE: /usr/local/apache-tomcat-11.0.5
Using CATALINA_HOME: /usr/local/apache-tomcat-11.0.5
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-11.0.5/temp
Using JRE_HOME: /usr/share/elasticsearch/jdk
Using CLASSPATH: /usr/local/apache-tomcat-11.0.5/bin/bootstrap.jar:/usr/local/apache-tomcat-11.0.5/bin/tomcat-juli.jar
Using CATALINA_OPTS:
[root@elk93 ~]#
[root@elk93 ~]#
[root@elk93 ~]# vim /usr/local/apache-tomcat-11.0.5/conf/server.xml # 随意改错配置就可以
[root@elk93 ~]#
[root@elk93 ~]# catalina.sh start
Using CATALINA_BASE: /usr/local/apache-tomcat-11.0.5
Using CATALINA_HOME: /usr/local/apache-tomcat-11.0.5
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-11.0.5/temp
Using JRE_HOME: /usr/share/elasticsearch/jdk
Using CLASSPATH: /usr/local/apache-tomcat-11.0.5/bin/bootstrap.jar:/usr/local/apache-tomcat-11.0.5/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
[root@elk93 ~]#
6. 编写filebeat采集Redis多行配置
2.将日志采集后写入ES集群
[root@elk93 ~]# cat /tmp/filestream-tomcat-error-to-es.yaml
filebeat.inputs:
- type: filestreampaths:- /usr/local/apache-tomcat-11.0.5/logs/catalina*parsers:- multiline:type: patternpattern: '^\d'negate: truematch: after#output.console:
# pretty: true
output.elasticsearch:hosts:- 10.0.0.91:9200- 10.0.0.92:9200- 10.0.0.93:9200index: linux95-modules-tomcat-err-%{+yyyy.MM.dd}setup.ilm.enabled: false
setup.template.name: "linux95"
setup.template.pattern: "linux95-*"
[root@elk93 ~]#
[root@elk93 ~]#
[root@elk93 ~]# rm -rf /var/lib/filebeat/
[root@elk93 ~]#
[root@elk93 ~]# filebeat -e -c /tmp/filestream-tomcat-error-to-es.yaml
四、小结
-
Filebeat 多行采集(multiline):在 Filebeat 端将一条跨多行的日志事件“拼接合并”为一个完整的 Event,发送到下游存储/分析系统。
-
为什么用:保证异常堆栈、JSON、YAML 等多行格式的日志以完整单元展示,方便检索与关联,减轻下游 Logstash/Elasticsearch 的工作量。
-
核心配置:在对应的
filebeat.inputs
区块中打开multiline.enabled: true
,并通过pattern
、negate
、match
、max_lines
、timeout
等字段精确地告诉 Filebeat 怎样判定“某行属于上一事件的延续”或“是新事件的开始”。 -
调试思路:先在小文件或命令行里测试正则匹配效果,再结合 max_lines/timeout 参数做压力测试,最终在 kibana/ES 中验证效果。
掌握以上原理与配置范式后,就能针对几乎所有类型的多行日志进行正确采集,极大地提升日志分析与排查效率。祝使用顺利!