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