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. 1. 保持日志完整性,方便问题定位

    • 如果一个 Java 异常堆栈分散在 10 行里,而 Filebeat 默认逐行发送,ES/Kibana 中会把这 10 行当成 10 条日志分别索引,后面查找异常时就无法一次性看到完整堆栈。

    • 多行采集让我们在 Filebeat 端就把这 10 行合并成 1 条完整记录,这样在 Kibana 中检索、聚合、关联时就能一次性看到整个堆栈,极大提升排错效率。

  2. 2. 减轻下游处理压力

    • 如果不做多行合并,需要依赖 Logstash 或者 Ingest Pipeline 去做“多行合并”或“事件聚合”,相对复杂,还会增加延迟。Filebeat 多行采集是在采集端完成合并,发送到 Elasticsearch 时已经是一条完整事件,更轻量高效。

    • 倘若日志源端已经分好行,但下游只关心“整条消息”,Filebeat 级别就做合并能减少网络、IO 和 Elasticsearch 索引的总体负载。

  3. 3. 适应常见应用输出格式

    • 许多主流框架(如 Log4j、Logback、Spring Boot 等)输出异常或某些调试信息时,都会将同一次异常的多行堆栈分为多行打印。Filebeat 多行功能可以无缝兼容这些格式。

    • 如果你有自己定义的日志格式(比如自定义脚本在多行写入一条业务描述),也能够通过正则将它们合并为一条事件。

总之,多行采集能保证“一条业务/异常”对应“一条事件”,而不是“N 条事件”。

三、如何做到多行采集

Filebeat 的多行采集是在配置文件中通过 multiline 选项来实现的。常见配置步骤如下:

  1. 打开 Filebeat 配置文件

    • 默认位置: /etc/filebeat/filebeat.yml

    • 或者在自定义 modular 配置目录下(例如 /etc/filebeat/modules.d//etc/filebeat/config.d/ 中对应的文件)。

  2. 在对应的 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.yml
  reload.enabled: true

output.elasticsearch:
  hosts:
  - 10.0.0.91:9200
  - 10.0.0.92:9200
  - 10.0.0.93:9200
  index: 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: 5
  index.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: filestream
  paths:
    - /var/log/redis/redis-server.log*
  # 配置解析器
  parsers:
    # 定义多行匹配
  - multiline:
      # 指定匹配的类型
      type: pattern
      # 定义匹配模式
      pattern: '^\d'
      # 参考官网: https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html
      negate: true
      match: after

#output.console:
#  pretty: true
output.elasticsearch:
  hosts:
  - 10.0.0.91:9200
  - 10.0.0.92:9200
  - 10.0.0.93:9200
  index: 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: filestream
  paths:
    - /usr/local/apache-tomcat-11.0.5/logs/catalina*
  parsers:
  - multiline:
      type: pattern
      pattern: '^\d'
      negate: true
      match: after

#output.console:
#  pretty: true
output.elasticsearch:
  hosts:
  - 10.0.0.91:9200
  - 10.0.0.92:9200
  - 10.0.0.93:9200
  index: 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,并通过 patternnegatematchmax_linestimeout 等字段精确地告诉 Filebeat 怎样判定“某行属于上一事件的延续”或“是新事件的开始”。

  • 调试思路:先在小文件或命令行里测试正则匹配效果,再结合 max_lines/timeout 参数做压力测试,最终在 kibana/ES 中验证效果。

掌握以上原理与配置范式后,就能针对几乎所有类型的多行日志进行正确采集,极大地提升日志分析与排查效率。祝使用顺利!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值