Filebeat获取的文件可能包含跨多行文本的消息,例如,多行消息在包含Java堆栈跟踪的文件中很常见。为了正确处理这些多行事件,你需要在filebeat.yml中配置multiline以指定哪一行是单个事件的一部分。
1.配置项
在filebeat.yml的filebeat.inputs区域指定怎样处理跨多行的消息
1 2 3
| multiline.pattern: '^\[' multiline.negate: true multiline.match: after
|
上面的例子中,Filebeat将所有不以 [ 开始的行与之前的行进行合并。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| multiline.pattern 指定用于匹配多行的正则表达式 multiline.negate 定义模式是否被否定。默认false。 multiline.match 指定Filebeat如何把多行合并成一个事件。可选的值是 after 或者 before。 multiline.flush_pattern 指定一个正则表达式,多行将从内存刷新到磁盘。 multiline.max_lines 可以合并成一个事件的最大行数。如果一个多行消息包含的行数超过max_lines,则超过的行被丢弃。默认是500。
|
2.多行配置示例
2.1 Java堆栈跟踪
Java堆栈跟踪由多行组成,在初始行之后的每一行都以空格开头,例如下面这样:
1 2 3 4
| 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)
|
为了把这些行合并成单个事件,用写了多行配置:
1 2 3
| multiline.pattern: '^[[:space:]]' multiline.negate: false multiline.match: after
|
这个配置将任意以空格开始的行合并到前一行
下面是一个稍微更复杂的例子
1 2 3 4 5 6 7
| 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
|
为了合并这个,用下面的配置:
1 2 3
| multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:' multiline.negate: false multiline.match: after
|
在这个例子中,模式匹配下列行:
1)以空格开头,后面跟 at 或者 … 的行
2)以 Caused by: 开头的行
一些编程语言使用行尾的反斜杠()字符表示该行继续,如本例所示:
1 2
| printf ("%10.10ld \t %10.10ld \t %s\ %f", w, x, y, z );
|
为了把这样的多行合并成单个事件,用下列配置:
1 2 3
| multiline.pattern: '\\$' multiline.negate: false multiline.match: before
|
这段配置合并任意以 \ 结尾的行
2.2 时间戳
下面是以时间戳开始的日志
1 2
| [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]
|
为了合并这种行,用下列配置:
1 2 3 4 5 6 7 8
| multiline.pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}' multiline.negate: true multiline.match: after [0-9]{4}表示在0-9数字中读4位 [0-9]{2}表示在0-9数字中读2位 对应YYYY-MM-DD,即必须为这种格式的年月日 整个multiline.pattern意思则是:不是以YYYY-MM-DD开头的行合并到前一行
|
2.3 应用事件
有时你的应用日志包含事件,自定义的开始和结束时间,例如:
1 2 3
| [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
|
为了合并这种行,用下面的多行配置:
1 2 3 4
| multiline.pattern: 'Start new event' multiline.negate: true multiline.match: after multiline.flush_pattern: 'End event'
|