在解决应用程序问题时,多行日志为开发人员提供了宝贵的信息。 堆栈跟踪就是一个例子。 堆栈跟踪是引起异常时应用程序处于中间的一系列方法调用。 堆栈跟踪包括遇到错误的相关行以及错误自己。 能够在此处查看Java堆栈跟踪的示例:html
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堆栈跟踪将做为单个文档发送。java
multiline.pattern: '^[[:space:]]' multiline.negate: false multiline.match: after
指定要匹配的正则表达式模式。 请注意,Filebeat支持的正则表达式模式与Logstash支持的模式有些不一样。 有关受支持的正则表达式模式的列表,请参见正则表达式支持。 根据你配置其余多行选项的方式,与指定正则表达式匹配的行将被视为上一行的延续或新多行事件的开始。 你能够设置 negate 选项以否认模式。正则表达式
multiline.max_lines
设置选项来刷新多行消息的内存,设置单个事件中能够包含的最大行数elasticsearch
multiline.timeout
设置超时时间,在指定的超时后,即便未找到新的模式来启动新事件,Filebeat也会发送多行事件。ide
定义是否为否认模式,也就是和上面定义的模式相反。 默认为false。工具
指定Filebeat如何将匹配的行组合到事件中。 设置在以后 (after) 或以前 (before)。 这些设置的行为取决于你为否认指定的内容:ui
negate | match | 结果 | pattern: ^b 匹配以b开头的行 |
false | after | 与模式匹配的连续行将追加到不匹配的前一行。在右边以 a 为开spa 头的行是和 pattern 不相匹配的,那么它后面匹配以 b 为开头的行.net 将被追加到前面的以 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