专栏首页奕空filebeat合并多行日志示例

filebeat合并多行日志示例

译文

多行配置示例

本节中的示例包括以下内容:

  • 将Java堆栈跟踪日志组合成一个事件
  • 将C风格的日志组合成一个事件
  • 结合时间戳处理多行事件

Java堆栈跟踪

Java示例一:

Java堆栈跟踪由多行组成,每一行在初始行之后以空格开头,如本例中所述:

Exception in thread "main" java.lang.NullPointerException
        at com.example.myproject.Book.getTitle(Book.java:16)
        at com.example.myproject.Author.getBookTitles(Author.java:25)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

要将这些行整合到Filebeat中的单个事件中,请使用以下多行配置:

multiline.pattern: '^[[:space:]]'
multiline.negate: false
multiline.match: after

此配置将以空格开头的所有行合并到上一行。

Java示例二:

下面是一个Java堆栈跟踪日志,稍微复杂的例子:

Exception in thread "main" java.lang.IllegalStateException: A book has a null property
       at com.example.myproject.Author.getBookIds(Author.java:38)
       at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
Caused by: java.lang.NullPointerException
       at com.example.myproject.Book.getId(Book.java:22)
       at com.example.myproject.Author.getBookIds(Author.java:35)
       ... 1 more

要将这些行整合到Filebeat中的单个事件中,请使用以下多行配置:

multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:'
multiline.negate: false
multiline.match: after

此配置解释如下:

  • 将以空格开头的所有行合并到上一行
  • 并把以Caused by开头的也追加到上一行

C风格的日志

一些编程语言在一行末尾使用反斜杠(\)字符,表示该行仍在继续,如本例中所示:

printf ("%10.10ld  \t %10.10ld \t %s\
  %f", w, x, y, z );

要将这些行整合到Filebeat中的单个事件中,请使用以下多行配置:

multiline.pattern: '\\$'
multiline.negate: false
multiline.match: before

此配置将以\字符结尾的任何行与后面的行合并。

时间戳 来自Elasticsearch等服务的活动日志通常以时间戳开始,然后是关于特定活动的信息,如下例所示:

[2015-08-24 11:49:14,389][INFO ][env                      ] [Letha] using [1] data paths, mounts [[/
(/dev/disk1)]], net usable_space [34.5gb], net total_space [118.9gb], types [hfs]

要将这些行整合到Filebeat中的单个事件中,请使用以下多行配置:

multiline.pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after

此配置使用negate: truematch: after设置来指定任何不符合指定模式的行都属于上一行。

应用程序事件

有时您的应用程序日志包含以自定义标记开始和结束的事件,如以下示例:

[2015-08-24 11:49:14,389] Start new event
[2015-08-24 11:49:14,395] Content of processing something
[2015-08-24 11:49:14,399] End event

要在Filebeat中将其整合为单个事件,请使用以下多行配置:

multiline.pattern: 'Start new event'
multiline.negate: true
multiline.match: after
multiline.flush_pattern: 'End event'

此配置把指定字符串开头,指定字符串结尾的多行合并为一个事件。

译自:elastic

实践

实践所用材料 前往 码云

实践Java示例一:

日志如下,预计可得5条数据

test-a.log 开始测试,这也是个事件
Exception in thread "main" java.lang.NullPointerException 空指针test1start
        at com.example.myproject.Book.getTitle(Book.java:16)
        at com.example.myproject.Author.getBookTitles(Author.java:25)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
		空指针test1end
Exception in thread "main" java.lang.NullPointerException 空指针test2start
        at com.example.myproject.Book.getTitle(Book.java:16)
        at com.example.myproject.Author.getBookTitles(Author.java:25)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
		空指针test2end
Exception in thread "main" java.lang.NullPointerException 空指针test3start
        at com.example.myproject.Book.getTitle(Book.java:16)
        at com.example.myproject.Author.getBookTitles(Author.java:25)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
		空指针test3end
test-a.log 结束测试,这也是个事件

Kibana查看结果

获取了5条数据,空格的追加到上一个事件,实践成功。

实践Java示例二:这个有点坎坷,合并的一塌糊涂,大家做测试的时候最好用真实日志做正则验证,此处不赘述了。

实践时间戳:

日志如下,预计可得3条数据

时间戳开始,这个不会被抓取
[2015-08-24 11:49:14,389][INFO ][env                      ] [Letha] using [1] data paths, mounts [[/ 时间戳A-1
(/dev/disk1)]], net usable_space [34.5gb], net total_space [118.9gb], types [hfs] 时间戳A-2
[2016-08-24 11:49:14,389][INFO ][env                      ] [Letha] using [1] data paths, mounts [[/ 时间戳B-1
(/dev/disk1)]], net usable_space [34.5gb], net total_space [118.9gb], types [hfs] 时间戳B-2
[2017-08-24 11:49:14,389][INFO ][env                      ] [Letha] using [1] data paths, mounts [[/ 时间戳C-1
(/dev/disk1)]], net usable_space [34.5gb], net total_space [118.9gb], types [hfs] 时间戳C-2
时间戳结束,这个不会被抓取

Kibana查看结果

虽然也得到了3条数据,但合并的有些尴尬,看来需要抽空在补一篇正则规则了。

综上,合并没什么问题,重点在正则,做合并的时候先做做测试,看是否符合自己的预期。

真实数据测试时可以先做下数据筛选

#exclude_lines: ['^DBG']
#include_lines: ['^ERR', '^WARN']

拓展知识

filebeat和logstash的合并方式几乎无区别

input {
    file {
        path => "/var/*.log"
        codec => multiline {
            pattern => "^\[\d{2}-"
            negate => true
            what => "previous"
        }
    }
}
what确定合并属于上一个事件还是下一个事件,可以为next和previous
而filebeat对应的是multiline.match: after和before

这是一个传承的关系:

因为logstash是jvm跑的,资源消耗比较大,所以后来作者又用golang写了一个功能较少但是资源消耗也小的轻量级的logstash-forwarder。不过作者只是一个人,加入elastic以后,因为elastic本身还收购了另一个开源项目packetbeat,而这个项目专门就是用golang的,有整个团队,所以elastic干脆把logstash-forwarder的开发工作也合并到同一个golang团队来搞,于是新的项目就叫filebeat了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ELK学习笔记之filebeat合并多行日志示例

    来自Elasticsearch等服务的活动日志通常以时间戳开始,然后是关于特定活动的信息,如下例所示:

    Jetpropelledsnake21
  • 【全文检索_10】Filebeat 基本使用

      Filebeat 是 Beats 的一员,用于转发和集中日志数据的轻量级传送工具。当面对成百上千、甚至成千上万的服务器、虚拟机和容器生成的日志时,Fileb...

    Demo_Null
  • Linux操作系统安装ELK stack日志管理系统--(1)Logstash和Filebeat的安装与使用

    (1)ELK是Elasticsearch,Logstash,Kibana 开源软件的集合,对外是作为一个日志管理系统的开源方案。它可以从任何来源,任何格式进行日...

    Java后端技术
  • EFK实战二 - 日志集成

    在EFK基础架构中,我们需要在客户端部署Filebeat,通过Filebeat将日志收集并传到LogStash中。在LogStash中对日志进行解析后再将日志传...

    JAVA日知录
  • Elastic 技术栈之 Filebeat

    Elastic 技术栈之 Filebeat 简介 Beats 是安装在服务器上的数据中转代理。 Beats 可以将数据直接传输到 Elasticsearch 或...

    静默虚空
  • 网易基于Filebeat的日志采集服务设计与实践

    云原生技术大潮已经来临,技术变革迫在眉睫。 在这股技术潮流之中,网易推出了 轻舟微服务平台,集成了微服务、Service Mesh、容器云、DevOps等组件...

    Spark学习技巧
  • Filebeat入门

    Beats 可以将数据直接传输到 Elasticsearch 或传输到 Logstash 。

    py3study
  • 这款轻量级日志搬运神器,成百上千台服务器产生的日志不在话下

    Filebeat是本地文件的日志数据采集器,可监控日志目录或特定日志文件(tail file),并将它们转发给Elasticsearch或Logstatsh进行...

    用户2781897
  • 容器日志知多少 (2) 开源日志管理方案ELK/EFK

    本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。上一篇《你必须知道的容器日志(1)》中介绍了Dock...

    Edison Zhou
  • 关于ELK架构原理与介绍

    ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一...

    lyb-geek
  • Rainbond通过插件整合ELK/EFK,实现日志收集

    ELK 是三个开源项目的首字母缩写:Elasticsearch、Logstash 和 Kibana。但后来出现的 FileBeat 可以完全替代 Logstas...

    Rainbond开源
  • Beats:Beats 入门教程 (一)

    在今天的这个教程里,我们来针对初学者如何快速地了解 Beats 是什么,并如何快速地部署 Beats。如果你想了解更多关于 Beats 方面的知识,可以参阅我的...

    腾讯云大数据
  • ELK学习笔记之ELK架构与介绍

    一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档...

    Jetpropelledsnake21
  • 微服务架构中进行日志采集以及统一处理

    微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈...

    aoho求索
  • Filebeat+Kafka+Logstash+Elasticsearch+Kibana 构建日志分析系统

    随着时间的积累,日志数据会越来越多,当你需要查看并分析庞杂的日志数据时,可通过 Filebeat+Kafka+Logstash+Elasticsearch 采集...

    高楼Zee
  • logstash kafka filebeat zabbix

    logstash 启动多个conf 文件进行日志处理时,默认不是每个配置文件独立运行,而是作为一个整体,每个input会匹配所有的filter,然后匹配所有的o...

    Kevin song
  • 【Elasticsearch全文搜索引擎实战】之Filebeat快速入门

    用过ELK(Elasticsearch, Logstash, Kibana)的人应该都面临过同样的问题,Logstash虽然功能强大:支持许多的input/ou...

    mantou
  • 【ES私房菜】Filebeat安装部署及配置详解

    Filebeat是Beat成员之一,基于Go语言,无任何依赖,并且比logstash更加轻量,非常适合安装在生产机器上,不会带来过高的资源占用,轻量意味着简单。

    张戈
  • 05 . ELK Stack简介原理及部署应用

    常见_youmen

扫码关注云+社区

领取腾讯云代金券