多行消息.md

多行消息在包含 Java 堆栈跟踪的文件中很常见。为了正确处理这些多行事件,您需要在filebeat.yml文件中配置多行设置,以指定哪些行是单个事件的一部分。

如果要将多行事件发送到 Logstash,请在将事件数据发送到 Logstash 之前使用此处描述的选项处理多行事件。

尝试在 Logstash 中实现多行事件处理(for example, by using the 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:允许您聚合恒定数量的行数
  • which_pattern:按模式聚合行,而不匹配(match)选项

multiline.pattern

指定要匹配的正则规则。请注意,FileBeat 支持的正则与 Logstash 支持的有些不同。有关支持的正则请参阅 正则表达式支持

pattern匹配的行将被视为前一行的延续或新多行事件的开始。具体要搭配negatematch来确定。

multiline.negate

对匹配规则取反,默认false表示不取反,类似grep-v,例如下面的例子表示匹配以[开头的行:

multiline.pattern: '^\['
multiline.negate: false

下面的例子表示匹配不以[开头的行:

multiline.pattern: '^\['
multiline.negate: true

multiline.match

指定 FileBeat 如何将匹配的行组合到事件中。设置afterbefore

negate match Result Example pattern: ^b
false after 匹配的连续行将附加到不匹配的前一行。
1.匹配的连续行是 bb,不匹配的前一行是 a
2.匹配的连续行是 bb,不匹配的前一行是 c
Lines a b b c b b become "abb" and "cbb"
false before 匹配的连续行被添加到不匹配的下一行之前。
1.匹配的连续行是 bb,不匹配的下一行是 a
2.匹配的连续行是 bb,不匹配的下一行是 c
Lines b b a b b c become "bba" and "bbc"
true after 不匹配的连续行将附加到匹配的前一行。
1.不匹配的连续行是 ac,匹配的前一行是 b
2.不匹配的连续行是 de,匹配的前一行是 b
Lines b a c b d e become "bac" and "bde"
true before 不匹配的连续行被添加到匹配的下一行之前。
1.不匹配的连续行是 ac,匹配的下一行是 b
2.不匹配的连续行是 de,匹配的下一行是 b
Lines a c b d e b become "acb" and "deb"

after设置相当于Logstash中的previousbefore相当于next

multiline.flush_pattern

指定一个正则表达式,结束多行消息。仅适用于pattern类型。

适用于有明确的开始和结束标志的日志事件,例如下面的例子,每条日志都是以Start new event开始,以End event结束:

[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: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
parsers:
  - multiline:
      type: pattern
      pattern: "Start new event"
      negate: true
      match: after
      flush_pattern: "End event"

multiline.max_lines

可以组合成一个事件的最大行数。如果多行消息包含max_lines以上,则丢弃任何其他行。默认值为 500。

multiline.timeout

在指定的超时后,即使当前的多行匹配未结束,FileBeat 也会发送多行事件。默认值为 5s。

multiline.count_lines

要聚合成单个事件的行数。

multiline.skip_newline

设置后,多行事件在没有行分隔符的情况下连接。即行之间去掉\n,把多行合并成一行。

多行配置示例

本节中的示例涵盖以下用例:

  • 将 Java 堆栈跟踪合并到单个事件中
  • 将 C 风格的行延续组合到单个事件中
  • 组合来自时间戳事件的多行

Java stack traces

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)

要将这些行合并到 FileBeam 中的单个事件中,请使用以下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

Using log input:

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

此配置使用negate: true and 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

要将这些行合并到 FileBeat 中的单个事件中,请使用以下filestream类型的多行配置:

parsers:
  - multiline:
      type: pattern
      pattern: "Start new event"
      negate: true
      match: after
      flush_pattern: "End event"

Using log input:

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

测试正则表达式


多行消息.md
http://blog.lujinkai.cn/运维/ELK/filebeats/配置/inputs/多行消息/
作者
像方便面一样的男子
发布于
2023年12月5日
许可协议