正在加载

管理多行消息

Filebeat 采集的文件可能包含跨越多行文本的消息。例如,多行消息在包含 Java 堆栈跟踪的文件中很常见。为了正确处理这些多行事件,您需要在 filebeat.yml 文件中配置 multiline 设置,以指定哪些行属于单个事件。

重要

如果您将多行事件发送到 Logstash,请使用此处描述的选项在将事件数据发送到 Logstash 之前处理多行事件。尝试在 Logstash 中实现多行事件处理(例如,使用 Logstash multiline codec)可能会导致流混合和数据损坏。

另请阅读 避免 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(通过模式聚合行,不带 match 选项)。
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 中的 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 堆栈跟踪由多行组成,初始行之后的每一行都以空白字符开头,如下例所示

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 中将这些行合并到单个事件中,请结合 filestream 使用以下多行配置

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

为了在 Filebeat 中将这些行合并到单个事件中,请结合 filestream 使用以下多行配置

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 );

为了在 Filebeat 中将这些行合并到单个事件中,请结合 filestream 使用以下多行配置

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]

为了在 Filebeat 中将这些行合并到单个事件中,请结合 filestream 使用以下多行配置

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

为了在 Filebeat 中将其合并为单个事件,请结合 filestream 使用以下多行配置

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 设置,并在内容反引号 ( ) 之间粘贴示例消息。然后点击 Run,您将看到消息中哪些行与您指定的配置匹配。例如

go playground

© . All rights reserved.