一、配置解释:
在filebeat.yml的filebeat.inputs中,有关于多行日志合并的配置:
multiline.pattern # 指定正则表达式去匹配指定的行,例如multiline.pattern: '^\[',意思是去匹配以[开头的行
multiline.negate # 定义pattern是否被否认,默认值是false,若为true,意思是对上面的匹配进行反转(就是实际去匹配不以pattern的行)
multiline.match # 指定Filebeat如何合并匹配的行,有两个值after和before
# 如果negate设置为false,match设置为after,Filebeat就会把不匹配的行作为行首,把匹配的行插入到行首后。
# 如果negate设置为true,match设置为after,Filebeat就会把匹配的行作为行首,把不匹配的行插入到行首后。
multiline.flush_pattern # 指定正则表达式去匹配指定的行作为multline-message的结束,刷新的内存,开始匹配新的多行
multiline.max_lines # 指定合并最大行数
multiline.timeout # 设定一个超时时间,在时间结束后,即使没有匹配到新pattern来启动新事件,Filebeat也会发送多行事件。默认值是5秒
二、我司示例:
观察到我司日志每一条都是以时间日期开头,后面日志内容会有换行,行首还有空格,还会有java堆栈报错,经实践采用以下配置:
multiline.pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after
上面配置的意思是:不以时间格式([2019-06-06)开头的行都合并到上一行的末尾。
注意:日志格式要统一
三、其他示例:
来自官方文档翻译:
1、Java堆栈跟踪
1)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
此配置将以空格开头的所有行合并到上一行。
2)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开头的也追加到上一行
2、C风格的日志
一些编程语言在一行末尾使用反斜杠()字符,表示该行仍在继续,如本例中所示:
printf ("%10.10ld \t %10.10ld \t %s\
%f", w, x, y, z );
要将这些行整合到Filebeat中的单个事件中,请使用以下多行配置:
multiline.pattern: '\\$'
multiline.negate: false
multiline.match: before
此配置将以\字符结尾的任何行与后面的行合并。
3、时间戳
来自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: true
和match: after
设置来指定任何不符合指定模式的行都属于上一行。
4、应用程序事件
有时您的应用程序日志包含以自定义标记开始和结束的事件,如以下示例:
[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'
此配置把指定字符串开头,指定字符串结尾的多行合并为一个事件。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lxwno.1@163.com