ELK学习笔记之filebeat合并多⾏⽇志⽰例0x00 概述
本节中的⽰例包括以下内容:
将Java堆栈跟踪⽇志组合成⼀个事件
将C风格的⽇志组合成⼀个事件
结合时间戳处理多⾏事件
同理,你可以把如下的正则应⽤在容器的yaml⽂件内。
0x01 Java堆栈⽇志
Java⽰例⼀:
Java堆栈跟踪由多⾏组成,每⼀⾏在初始⾏之后以空格开头,如本例中所述:
Exception in thread "main" java.lang.NullPointerException
Title(Book.java:16)
BookTitles(Author.java:25)
project.Bootstrap.main(Bootstrap.java:14)
要将这些⾏整合到Filebeat中的单个事件中,请使⽤以下多⾏配置:
multiline.pattern: '^[[:space:]]'
multiline.match: after
此配置将以空格开头的所有⾏合并到上⼀⾏。
Java⽰例⼆:
下⾯是⼀个Java堆栈跟踪⽇志,稍微复杂的例⼦:
Exception in thread "main" java.lang.IllegalStateException: A book has a null property
BookIds(Author.java:38)
project.Bootstrap.main(Bootstrap.java:14)
Caused by: java.lang.NullPointerException
Id(Book.java:22)
BookIds(Author.java:35)
... 1 more
要将这些⾏整合到Filebeat中的单个事件中,请使⽤以下多⾏配置:
multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:'正则匹配多行
multiline.match: after
此配置解释如下:
将以空格开头的所有⾏合并到上⼀⾏
并把以Caused by开头的也追加到上⼀⾏
0x02 C风格的⽇志
⼀些编程语⾔在⼀⾏末尾使⽤反斜杠(\)字符,表⽰该⾏仍在继续,如本例中所⽰:
printf ("%10.10ld  \t %10.10ld \t %s\
%f", w, x, y, z );
要将这些⾏整合到Filebeat中的单个事件中,请使⽤以下多⾏配置:
multiline.pattern: '\\$'
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.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.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了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。