管理多行消息编辑

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 如何将匹配的行组合到一个事件中。设置可以是 afterbefore。这些设置的行为取决于您为 negate 指定的内容

negate 的设置 match 的设置 结果 例如 pattern: ^b

false

after

匹配该模式的连续行将附加到不匹配的上一行。

Lines a b b c b b become "abb" and "cbb"

false

before

匹配该模式的连续行将添加到不匹配的下一行之前。

Lines b b a b b c become "bba" and "bbc"

true

after

不匹配该模式的连续行将附加到匹配的上一行。

Lines b a c b d e become "bac" and "bde"

true

before

不匹配该模式的连续行将添加到匹配的下一行之前。

Lines a c b d e b become "acb" and "deb"

after 设置等效于 Logstash 中的 previousbefore 等效于 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: truematch: 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 设置,然后将示例消息粘贴到内容反引号 (` `) 之间即可。然后单击“运行”,您将看到消息中的哪些行与您指定的配置匹配。例如

go playground