当前位置: 首页 > ops >正文

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.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,并通过 patternnegatematchmax_linestimeout 等字段精确地告诉 Filebeat 怎样判定“某行属于上一事件的延续”或“是新事件的开始”。

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

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

http://www.xdnf.cn/news/10826.html

相关文章:

  • java-spring
  • Blinko智能笔记系统实现跨平台同步与隐私保护的完整技术方案解析
  • 2025年MathorCup数学建模D题短途运输货量预测及车辆调度问题解题文档与程序
  • dataX(入门,mysql到doris)
  • 软件评测师 案例真题笔记
  • RDMA简介1之RDMA开发必要性
  • Java 中执行命令并使用指定配置文件的最佳实践
  • [蓝桥杯]生物芯片
  • 今日主题二分查找(寻找峰值 力扣162)
  • 初识小智AI项目
  • 酵母杂交那些事儿(一)
  • [Python] struct.unpack() 用法详解
  • 在 Linux 上安装 Nmap 工具
  • CSRF攻击与防御
  • 现代密码学介绍
  • 前端开发处理‘流式数据’与‘非流式数据’,在接收完整与非完整性数据时应该如何渲染和使用
  • 【产品研究】安克创新公司产品研究
  • 推荐算法八股
  • STM32外部中断(EXTI)以及旋转编码器的简介
  • 【深度学习-Day 22】框架入门:告别数据瓶颈 - 掌握PyTorch Dataset、DataLoader与TensorFlow tf.data实战
  • MongoTemplate常用api学习
  • [手写系列]从0到1开发并上线Edge浏览器插件
  • AJ-Report
  • 深拷贝与浅拷贝的区别?如何手写实现一个深拷贝?
  • 英语写作中“不少于(小于)”no less than替代no fewer than的用法
  • 【文献精读】Explaining grokking through circuit efficiency
  • virtualbox安装扩展工具以支持共享文件夹
  • Foundation Models for Generalist Geospatial Artificial Intelligence论文阅读
  • RTOS:初始化新任务(含源码复杂点解读)
  • MyBatis相关面试题