管理多行消息
编辑管理多行消息编辑
Filebeat 收集的文件可能包含跨越多行文本的消息。例如,包含 Java 堆栈跟踪的文件中经常出现多行消息。为了正确处理这些多行事件,您需要在 filebeat.yml
文件中配置 multiline
设置,以指定哪些行属于单个事件。
如果您要将多行事件发送到 Logstash,请使用此处描述的选项在将事件数据发送到 Logstash 之前处理多行事件。尝试在 Logstash 中实现多行事件处理(例如,通过使用 Logstash 多行编解码器)可能会导致流混合和数据损坏。
另请阅读 避免 YAML 格式问题 和 正则表达式支持 以避免常见错误。
配置选项编辑
您可以在 filebeat.yml
配置文件的 filebeat.inputs
部分中指定以下选项,以控制 Filebeat 如何处理跨越多行的消息。
以下示例显示了如何在 Filebeat 中配置 filestream
输入以处理消息的第一行以括号 ([
) 开头的多行消息。
请注意,以下示例仅适用于 filestream
输入,不适用于 log
输入。
parsers: - multiline: type: pattern pattern: '^\[' negate: true match: after
如果您仍在使用已弃用的 log
输入,则无需使用 parsers
。
multiline.type: pattern multiline.pattern: '^\[' multiline.negate: true multiline.match: after
Filebeat 会获取所有不以 [
开头的行,并将它们与上一行组合在一起。例如,您可以使用此配置将多行消息的以下行连接到单个事件中
[beat-logstash-some-name-832-2015.11.28] IndexNotFoundException[no such index] at org.elasticsearch.cluster.metadata.IndexNameExpressionResolver$WildcardExpressionResolver.resolve(IndexNameExpressionResolver.java:566) at org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.concreteIndices(IndexNameExpressionResolver.java:133) at org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.concreteIndices(IndexNameExpressionResolver.java:77) at org.elasticsearch.action.admin.indices.delete.TransportDeleteIndexAction.checkBlock(TransportDeleteIndexAction.java:75)
-
multiline.type
- 定义要使用的聚合方法。默认值为
pattern
。其他选项包括count
,它允许您聚合固定数量的行,以及while_pattern
,它按模式聚合行,而不使用匹配选项。 -
multiline.pattern
- 指定要匹配的正则表达式模式。请注意,Filebeat 支持的正则表达式模式与 Logstash 支持的模式略有不同。有关支持的正则表达式模式列表,请参阅 正则表达式支持。根据您如何配置其他多行选项,匹配指定正则表达式的行将被视为前一行的延续或新的多行事件的开始。您可以设置
negate
选项来否定该模式。 -
multiline.negate
- 定义是否否定该模式。默认值为
false
。 -
multiline.match
-
指定 Filebeat 如何将匹配的行组合到一个事件中。设置可以是
after
或before
。这些设置的行为取决于您为negate
指定的内容negate
的设置match
的设置结果 例如 pattern: ^b
false
after
匹配该模式的连续行将附加到不匹配的上一行。
false
before
匹配该模式的连续行将添加到不匹配的下一行之前。
true
after
不匹配该模式的连续行将附加到匹配的上一行。
true
before
不匹配该模式的连续行将添加到匹配的下一行之前。
after
设置等效于 Logstash 中的previous
,before
等效于next
。 -
multiline.flush_pattern
- 指定一个正则表达式,当前多行将在该表达式处从内存中刷新,从而结束多行消息。仅适用于
pattern
类型。 -
multiline.max_lines
- 可以组合到一个事件中的最大行数。如果多行消息包含的行数超过
max_lines
,则将丢弃任何额外的行。默认值为 500。 -
multiline.timeout
- 在指定的超时时间后,即使没有找到新的模式来启动新的事件,Filebeat 也会发送多行事件。默认值为 5 秒。
-
multiline.count_lines
- 要聚合到单个事件中的行数。
-
multiline.skip_newline
- 设置后,多行事件将在没有行分隔符的情况下连接。
多行配置示例编辑
本节中的示例涵盖以下用例
- 将 Java 堆栈跟踪组合到单个事件中
- 将 C 样式的行延续组合到单个事件中
- 组合来自时间戳事件的多行
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)
要使用 filestream
将这些行合并到 Filebeat 中的单个事件中,请使用以下多行配置
parsers: - multiline: type: pattern pattern: '^[[:space:]]' negate: false match: after
使用 log
输入
multiline.type: pattern multiline.pattern: '^[[:space:]]' multiline.negate: false multiline.match: after
此配置会将以空格开头的任何行合并到上一行。
这是一个更复杂的 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
要使用 filestream
将这些行合并到 Filebeat 中的单个事件中,请使用以下多行配置
parsers: - multiline: type: pattern pattern: '^[[:space:]]+(at|\.{3})[[:space:]]+\b|^Caused by:' negate: false match: after
使用 log
输入
multiline.type: pattern multiline.pattern: '^[[:space:]]+(at|\.{3})[[:space:]]+\b|^Caused by:' multiline.negate: false multiline.match: after
在此示例中,该模式匹配以下行
- 以空格开头,后跟单词
at
或...
的行 - 以单词
Caused by:
开头的行
行延续编辑
几种编程语言在行尾使用反斜杠 (\
) 字符来表示该行继续,如本例所示
printf ("%10.10ld \t %10.10ld \t %s\ %f", w, x, y, z );
要使用 filestream
将这些行合并到 Filebeat 中的单个事件中,请使用以下多行配置
parsers: - multiline: type: pattern pattern: '\\$' negate: false match: before
使用 log
输入
multiline.type: pattern 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]
要使用 filestream
将这些行合并到 Filebeat 中的单个事件中,请使用以下多行配置
parsers: - multiline: type: pattern pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}' negate: true match: after
使用 log
输入
multiline.type: pattern multiline.pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}' multiline.negate: true multiline.match: after
此配置使用 negate: true
和 match: 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
要使用 filestream
将其合并为 Filebeat 中的单个事件,请使用以下多行配置
parsers: - multiline: type: pattern pattern: 'Start new event' negate: true match: after flush_pattern: 'End event'
使用 log
输入
multiline.type: pattern multiline.pattern: 'Start new event' multiline.negate: true multiline.match: after multiline.flush_pattern: 'End event'
flush_pattern
选项指定一个正则表达式,当前多行将在该表达式处刷新。如果您认为 pattern
选项指定事件的开头,则 flush_pattern
选项将指定事件的结尾或最后一行。
如果开始/结束日志块与非多行日志混合在一起,或者不同的开始/结束日志块彼此重叠,则此示例将无法正常工作。例如,以下示例中的 Some other log
日志行将被合并到一个单个多行文档中,因为它们既不匹配 multiline.pattern
也不匹配 multiline.flush_pattern
,并且 multiline.negate
设置为 true
。
[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 [2015-08-24 11:50:14,389] Some other log [2015-08-24 11:50:14,395] Some other log [2015-08-24 11:50:14,399] Some other log [2015-08-24 11:51:14,389] Start new event [2015-08-24 11:51:14,395] Content of processing something [2015-08-24 11:51:14,399] End event
测试您的多行正则表达式模式编辑
为了使您更容易测试多行配置中的正则表达式模式,我们创建了一个 Go Playground。您只需插入要使用的正则表达式模式以及 multiline.negate
设置,然后将示例消息粘贴到内容反引号 (` `) 之间即可。然后单击“运行”,您将看到消息中的哪些行与您指定的配置匹配。例如