ELK學習筆記之filebeat合並多行日志示例


0x00 概述

本節中的示例包括以下內容:

  • 將Java堆棧跟蹤日志組合成一個事件
  • 將C風格的日志組合成一個事件
  • 結合時間戳處理多行事件

同理,你可以把如下的正則應用在容器的yaml文件內。

 

0x01 Java堆棧日志

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)

要將這些行整合到Filebeat中的單個事件中,請使用以下多行配置:

multiline.pattern: '^[[:space:]]'
multiline.negate: false
multiline.match: after

此配置將以空格開頭的所有行合並到上一行。

 

Java示例二:

下面是一個Java堆棧跟蹤日志,稍微復雜的例子:

Exception in thread "main" java.lang.IllegalStateException: A book has a null property
       at com.example.myproject.Author.getBookIds(Author.java:38)
       at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
Caused by: java.lang.NullPointerException
       at com.example.myproject.Book.getId(Book.java:22)
       at com.example.myproject.Author.getBookIds(Author.java:35)
       ... 1 more

要將這些行整合到Filebeat中的單個事件中,請使用以下多行配置:

multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:'
multiline.negate: false
multiline.match: after

此配置解釋如下:

  • 將以空格開頭的所有行合並到上一行
  • 並把以Caused by開頭的也追加到上一行

 

0x02 C風格的日志

一些編程語言在一行末尾使用反斜杠(\)字符,表示該行仍在繼續,如本例中所示:

printf ("%10.10ld  \t %10.10ld \t %s\
  %f", w, x, y, z );

要將這些行整合到Filebeat中的單個事件中,請使用以下多行配置:

multiline.pattern: '\\$'
multiline.negate: false
multiline.match: before

此配置將以\字符結尾的任何行與后面的行合並。

 

0x03 時間戳

來自Elasticsearch等服務的活動日志通常以時間戳開始,然后是關於特定活動的信息,如下例所示:

[2019-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]

要將這些行整合到Filebeat中的單個事件中,請使用以下多行配置:

multiline.pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}'
multiline.negate: true
multiline.match: after
# 此配置使用negate: true和match: after設置來指定任何不符合指定模式的行都屬於上一行。

 

0x04 應用程序事件

有時您的應用程序日志包含以自定義標記開始和結束的事件,如以下示例:

[2019-08-24 11:49:14,389] Start new event
[2019-08-24 11:49:14,395] Content of processing something
[2019-08-24 11:49:14,399] End event

要在Filebeat中將其整合為單個事件,請使用以下多行配置:

multiline.pattern: 'Start new event'
multiline.negate: true
multiline.match: after
multiline.flush_pattern: 'End event'

此配置把指定字符串開頭,指定字符串結尾的多行合並為一個事件。

 

0x05 拓展知識

filebeat和logstash的合並方式幾乎無區別

input {
    file {
        path => "/var/*.log"
        codec => multiline {
            pattern => "^\[\d{2}-"
            negate => true
            what => "previous"
        }
    }
}
# what確定合並屬於上一個事件還是下一個事件,可以為next和previous
# 而filebeat對應的是multiline.match: after和before

這是一個傳承的關系:

因為logstash是jvm跑的,資源消耗比較大,所以后來作者又用golang寫了一個功能較少但是資源消耗也小的輕量級的logstash-forwarder。不過作者只是一個人,加入elastic以后,因為elastic本身還收購了另一個開源項目packetbeat,而這個項目專門就是用golang的,有整個團隊,所以elastic干脆把logstash-forwarder的開發工作也合並到同一個golang團隊來搞,於是新的項目就叫filebeat了。

 

參考1

參考2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM