管理多行事件
编辑管理多行事件
编辑一些用例会生成跨越多行的文本事件。为了正确处理这些多行事件,Logstash 需要知道如何区分哪些行属于单个事件。
多行事件处理比较复杂,依赖于正确的事件顺序。保证有序日志处理的最佳方法是在管道中尽早实现处理。
multiline 编解码器是处理 Logstash 管道中多行事件的首选工具。multiline 编解码器使用一组简单的规则合并来自单个输入的行。
配置 multiline 编解码器最重要的方面如下:
pattern
选项指定正则表达式。与指定正则表达式匹配的行被视为前一行的延续或新的多行事件的开始。您可以使用此配置选项中的 grok 正则表达式模板。what
选项有两个值:previous
或next
。previous
值指定与pattern
选项中的值匹配的行属于前一行。next
值指定与pattern
选项中的值匹配的行属于下一行。*negate
选项将多行编解码器应用于与pattern
选项中指定的正则表达式*不匹配*的行。
有关配置选项的更多信息,请参阅 multiline 编解码器插件的完整文档。
多行编解码器配置示例
编辑本节中的示例涵盖以下用例:
- 将 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)
要在 Logstash 中将这些行合并到单个事件中,请使用 multiline 编解码器的以下配置:
input { stdin { codec => multiline { pattern => "^\s" what => "previous" } } }
此配置将任何以空格开头的行合并到前一行。
行延续
编辑几种编程语言使用 \
字符在行尾表示行延续,例如:
printf ("%10.10ld \t %10.10ld \t %s\ %f", w, x, y, z );
要在 Logstash 中将这些行合并到单个事件中,请使用 multiline 编解码器的以下配置:
input { stdin { codec => multiline { pattern => "\\$" what => "next" } } }
此配置将任何以 \
字符结尾的行与下一行合并。
时间戳
编辑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]
要在 Logstash 中将这些行合并到单个事件中,请使用 multiline 编解码器的以下配置:
input { file { path => "/var/log/someapp.log" codec => multiline { pattern => "^%{TIMESTAMP_ISO8601} " negate => true what => previous } } }
此配置使用 negate
选项指定任何不以时间戳开头的行都属于前一行。