0x00 概述

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

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

同理,你可以把如下的正则应用在容器的yaml文件内。

0x01 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开头的也追加到上一行

0x02 C风格的日志

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

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

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

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

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

0x03 时间戳

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

[2019-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: true和match: after设置来指定任何不符合指定模式的行都属于上一行。

0x04 应用程序事件

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

[2019-08-24 11:49:14,389] Start new event
[2019-08-24 11:49:14,395] Content of processing something
[2019-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'

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

0x05 拓展知识

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了。

参考1

参考2

ELK学习笔记之filebeat合并多行日志示例的更多相关文章

  1. ELK-6.5.3学习笔记–使用filebeat管理微服务日志

    微服务日志打印. 转载于http://www.eryajf.net/2369.html 上边是输出了nginx日志,从而进行展示,以及各种绘图分析,而现在的需求是,要将微服务当中的日志汇总到elk当中 ...

  2. LevelDB 学习笔记2:合并

    LevelDB 学习笔记2:合并 部分图片来自 RocksDB 文档 Minor Compaction 将内存数据库刷到硬盘的过程称为 minor compaction 产出的 L0 层的 sstab ...

  3. ELK+Kafka学习笔记之FileBeat日志合并配置输出到kafka集群

    filebeat.prospectors: - type: log               #日志输出类型   enabled: true                             ...

  4. ELK学习笔记之CentOS 7下ELK(6.2.4)++LogStash+Filebeat+Log4j日志集成环境搭建

    0x00 简介 现在的公司由于绝大部分项目都采用分布式架构,很早就采用ELK了,只不过最近因为额外的工作需要,仔细的研究了分布式系统中,怎么样的日志规范和架构才是合理和能够有效提高问题排查效率的. 经 ...

  5. K8S学习笔记之filebeat采集K8S微服务java堆栈多行日志

    0x00 背景 K8S内运行Spring Cloud微服务,根据定制容器架构要求log文件不落地,log全部输出到std管道,由基于docker的filebeat去管道采集,然后发往Kafka或者ES ...

  6. ELK学习笔记之Logstash详解

    0x00 Logstash概述 官方介绍:Logstash is an open source data collection engine with real-time pipelining cap ...

  7. ELK学习笔记之logstash安装logstash-filter-multiline(在线离线安装)

    0x00 概述 ELK-logstash在搬运日志的时候会出现多行日志,普通的搬运会造成保存到ES中单条单条,很丑,而且不方便读取,logstash-filter-multiline可以解决该问题 g ...

  8. 使用 Filebeat 对多行日志进行处理(multiline)

    Filebeat 收集日志的过程中,默认是按行收取的,也就是每一行都会默认是一个单独的事件并添加时间戳.但是在收集一些特殊日志的时候,往往一个事件包含有多行,例如 Java 的堆栈跟踪日志: 20-0 ...

  9. python学习笔记(二十八)日志模块

    我们在写程序的时候经常会打一些日志来帮助我们查找问题,这次学习一下logging模块,在python里面如何操作日志.介绍一下logging模块,logging模块就是python里面用来操作日志的模 ...

随机推荐

  1. this.$route和this.$router区别

    this.$route 和 this.$router 这两个对象有什么区别: this.$route 是当前路由跳转对象,包含当前路由的name.path.query.params等属性 this.$ ...

  2. Centos7 下安装Redis4.0.6

    一.安装redis 第一步:下载redis安装包 wget http://download.redis.io/releases/redis-4.0.6.tar.gz [root@iZwz991stxd ...

  3. jetbrains 系列编辑器

    下载 webstorm下载地址:https://www.jetbrains.com/webstorm/download/previous.html idea下载地址:https://www.jetbr ...

  4. clientHeight获取屏幕可视化高度

    此时你设置后会发现屏幕的高度出现滚动条 那是因为body有8个外边距 设置margin:0就可以解决 watch可以区监听data中的数据,只要data中的数据发生变化 就可以执行watch中的函数了 ...

  5. Jmeter接口测试,怎么在下一个接口调用上一个接口的数据

    常用的两种方式,第二种容易上手1.使用正则提取器 jmeter 如何将上一个请求的结果作为下一个请求的参数——使用正则提取器(http://www.cnblogs.com/0201zcr/p/5089 ...

  6. File.createNewFile和 File.createTempFile比较和区别

    原文地址:http://wzhiju.iteye.com/blog/1119037 最近,在看代码时看到了一个方法, File.createTempFile() ,由此联想到File.createNe ...

  7. 阿里云重置CentOS的root默认密码

    问题 今天使用阿里云开了一个云服务器,系统为 CentOS ,远程连接登录时不知道默认root密码 解决方法 在 控制台-实例-操作 中选择 更多-密码/秘钥-重置实例密码 即可

  8. RaxML使用

    1.下载 https://github.com/stamatak/standard-RAxML 2.How many Threads shall I use? 重要的是要知道,RAxML PThrea ...

  9. 北漂不易,逆风前行[给想在北京工作的java同学们诚恳的建议!]

    作为一个北漂程序员(java开发),从业6年,北漂十一年,走了不少弯路,也曾孤独彷徨,楼主今天特地总结了一些经验,希望能给大家(准备做北漂 或 北漂的朋友们)一点启发.从生活.专业和薪水这2个方向来分 ...

  10. subprocess实用手册

    背景 python执行操作系统的命令,如python执行shell命令 subprocess模块主要用于创建子进程,并连接它们的输入.输出和错误管道,获取它们的返回状态.通俗地说就是通过这个模块,你可 ...