在解决应用程序问题时,多行日志为开发人员提供了宝贵的信息。 堆栈跟踪就是一个例子。 堆栈跟踪是引发异常时应用程序处于中间的一系列方法调用。 堆栈跟踪包括遇到错误的相关行以及错误本身。 可以在此处查看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)
当使用类似Elastic Stack的日志记录工具时,如果没有正确的配置,可能很难识别和搜索堆栈跟踪。 使用像Filebeat这样的开源轻型日志摄入器发送应用程序日志时,堆栈跟踪的每一行在Kibana中都将被视为单个文档。
因此,上面的堆栈跟踪将在Kibana中视为四个单独的文档。 这使得在堆栈跟踪中搜索和理解错误和异常变得很困难,因为它们与它们的上下文脱离了共同的事件。 使用Filebeat记录应用程序日志时,用户可以通过在filebeat.yml文件中添加配置选项来避免此问题。
你可以配置filebeat.yml输入部分 filebeat.inputs 以添加一些多行配置选项,以确保将多行日志(如堆栈跟踪)作为一个完整文档发送。 将以下配置选项添加到filebeat.yml输入部分,将确保上面引用的Java堆栈跟踪将作为单个文档发送。
multiline.pattern: '^[[:space:]]' multiline.negate: false multiline.match: after
- multiline.pattern
指定要匹配的正则表达式模式。 请注意,Filebeat支持的正则表达式模式与Logstash支持的模式有些不同。 有关受支持的正则表达式模式的列表,请参见正则表达式支持。 根据你配置其他多行选项的方式,与指定正则表达式匹配的行将被视为上一行的延续或新多行事件的开始。 你可以设置 negate 选项以否定模式。
multiline.max_lines
设置选项来刷新多行消息的内存,设置单个事件中可以包含的最大行数
multiline.timeout
设置超时时间,在指定的超时后,即使未找到新的模式来启动新事件,Filebeat也会发送多行事件。
- multiline.negate
定义是否为否定模式,也就是和上面定义的模式相反。 默认为false。
- multiline.match
指定Filebeat如何将匹配的行组合到事件中。 设置在之后 (after) 或之前 (before)。 这些设置的行为取决于你为否定指定的内容:
negate | match | 结果 | pattern: ^b 匹配以b开头的行 |
false | after |
与模式匹配的连续行将追加到不匹配的前一行。在右边以 a 为开 头的行是和 pattern 不相匹配的,那么它后面匹配以 b 为开头的行 将被追加到前面的以 a 为开头的行,所以第一个是 abb,第二个是 cbb |
|
false | before |
匹配模式的连续行将被添加到不匹配的下一行。在右边以 b 为开 头的行都是符号pattern的,而以 a 为开头的行是不匹配的,那么 在以 a 为截止之前的所有的行将被连起来形成一个整体,也就是 bba。第二次就是 bbc。 |
|
true | after |
不匹配模式的连续行将追加到匹配的前一行。在右边,a,c 行都 不是以 b 为开头的行,不符合 pattern。它们被追加到前面匹配的 以 b 为开头的行。 |
|
true | before | 与模式不匹配的连续行将被添加到下一个匹配的行之前。 |
我们还是以上面的log例子为例。我们来创建一个叫做 mulitline.log 的文件:
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 的配置文件:
filebeat.inputs: - type: log enabled: true paths: - /Users/liuxg/data/multiline/multiline.log multiline.pattern: '^[[:space:]]' multiline.negate: false multiline.match: after output.elasticsearch: hosts: ["localhost:9200"] index: "multiline" setup.ilm.enabled: false setup.template.name: multiline setup.template.pattern: multiline
运行 filebeat,我们看一下被导入的文档的内容:
GET multiline/_search
参考:
【1】https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html
转载自:
【2】https://blog.csdn.net/UbuntuTouch/article/details/106272704