多行消息在包含 Java 堆栈跟踪的文件中很常见。为了正确处理这些多行事件,您需要在filebeat.yml
文件中配置多行设置,以指定哪些行是单个事件的一部分。
如果要将多行事件发送到 Logstash,请在将事件数据发送到 Logstash 之前使用此处描述的选项处理多行事件。
尝试在 Logstash 中实现多行事件处理(for example, by using the Logstash multiline codec)可能会导致流和损坏数据的混合。
另请阅读 避免 YAML 格式问题 和 正则表达式支持 以避免常见错误。
配置选项
您可以在filebeat.yml
配置文件的filebeat.inputs
部分指定以下选项来控制 FileBeat 如何处理跨多行的消息。
以下示例显示如何在 FileBeat 中配置filestream
类型输入以处理多行消息,其中消息的第一行以 [
开头。
请注意,下面的示例仅适用于 filestream
类型输入,而不适用于 log
类型输入。
如果您仍然使用已弃用的log
类型输入,则无需使用parsers
。
FileBeat 获取所有不以[
开头的行,并将它们与以[
开头的前一行组合。例如,您可以使用此配置将多行消息的以下行连接到单个事件中:
multiline.type
pattern
:默认的
count
:允许您聚合恒定数量的行数
which_pattern
:按模式聚合行,而不匹配(match)选项
multiline.pattern
指定要匹配的正则规则。请注意,FileBeat 支持的正则与 Logstash 支持的有些不同。有关支持的正则请参阅 正则表达式支持。
pattern
匹配的行将被视为前一行的延续或新多行事件的开始。具体要搭配negate
和match
来确定。
multiline.negate
对匹配规则取反,默认false
表示不取反,类似grep
的-v
,例如下面的例子表示匹配以[
开头的行:
下面的例子表示匹配不以[
开头的行:
multiline.match
指定 FileBeat 如何将匹配的行组合到事件中。设置after
或before
:
negate |
match |
Result |
Example pattern: ^b |
false |
after |
匹配的连续行将附加到不匹配的前一行。 1.匹配的连续行是 bb,不匹配的前一行是 a 2.匹配的连续行是 bb,不匹配的前一行是 c |
|
false |
before |
匹配的连续行被添加到不匹配的下一行之前。 1.匹配的连续行是 bb,不匹配的下一行是 a 2.匹配的连续行是 bb,不匹配的下一行是 c |
|
true |
after |
不匹配的连续行将附加到匹配的前一行。 1.不匹配的连续行是 ac,匹配的前一行是 b 2.不匹配的连续行是 de,匹配的前一行是 b |
|
true |
before |
不匹配的连续行被添加到匹配的下一行之前。 1.不匹配的连续行是 ac,匹配的下一行是 b 2.不匹配的连续行是 de,匹配的下一行是 b |
|
after
设置相当于Logstash中的previous
,before
相当于next
。
multiline.flush_pattern
指定一个正则表达式,结束多行消息。仅适用于pattern
类型。
适用于有明确的开始和结束标志的日志事件,例如下面的例子,每条日志都是以Start new event
开始,以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 堆栈跟踪由多行组成,初始行之后的每一行都以空格开头,如下例所示:
要将这些行合并到 FileBeam 中的单个事件中,请使用以下filestream
类型的多行配置:
如果使用 log
输入类型:
此配置将以空格开头的任何行合并到上一行。
下面是一个 Java 堆栈跟踪,它呈现了一个稍微复杂一点的示例:
要将这些行合并到 FileBeat 中的单个事件中,请使用以下filestream
类型的多行配置:
如果使用 log
输入类型:
在此示例中,模式匹配以下行:
- 以空格开头的一行,后跟单词
at
或…
- 以
Caused by:
的开头的一行:
行延续
一些编程语言在行尾使用反斜杠(\)字符来表示该行继续,如下例所示:
要将这些行合并到 FileBeat 中的单个事件中,请使用以下filestream
类型的多行配置:
Using log
input:
此配置将以\字符结尾的任何行与后面的行合并。
时间戳
来自 Elasticsearch 等服务的活动日志通常以时间戳开头,然后是有关特定活动的信息,如下例所示:
要将这些行合并到 FileBeat 中的单个事件中,请使用以下filestream
类型的多行配置:
此配置使用negate: true
and match: after
设置来指定任何与指定模式不匹配的行都属于前一行。
应用程序事件
有时您的应用日志包含以自定义标记开始和结束的事件,例如以下示例:
要将这些行合并到 FileBeat 中的单个事件中,请使用以下filestream
类型的多行配置:
Using log
input:
flush_pattern
选项指定刷新当前多行的正则表达式。如果您认为pattern
选项指定事件的开头,flush_pattern
选项将指定事件的末尾或最后一行。
注意:
如果 开始/结束 日志块与非多行日志混合,或者不同的 开始/结束 日志块相互重叠,则此示例将无法正常工作。例如,以下示例中的Some other log
日志行将合并到单个多行文档中,因为它们既不匹配multiline.pattern
也不匹配multiline.flush_pattern
,并且multiline.negate
设置为true
。
测试正则表达式