管理多行消息

编辑

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)

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

go playground