在解決應用程序問題時,多行日志為開發人員提供了寶貴的信息。 堆棧跟蹤就是一個例子。 堆棧跟蹤是引發異常時應用程序處於中間的一系列方法調用。 堆棧跟蹤包括遇到錯誤的相關行以及錯誤本身。 可以在此處查看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