logstash 多行合併

場景&環境

環境:內網UAT環境ELK(elasticsearch、logstash、kibana)
日誌類型:Java ERROR Log
格式:[級別] [時間] [class類] | message
grok:\[%{LOGLEVEL}\] \[%{TIMESTAMP_ISO8601}\] \[%{JAVAFILE:class}\] \| (?<info>([\s\S]*))

問題:

在使用ELK 檢索日誌時發現本應屬於一條內容的日誌分到了多條日誌顯示,查看原日誌文件發現在應用打日誌時就換行了。
日誌行開頭爲“[” 檢查logstash 客戶端配置在file{}段已經有

codec => multiline {
            pattern => "^\["
            negate => true
            what => "previous"

但並沒有解決換行的問題,查資料發現需要在filter{}段寫multiline相關配置。

方案實施:

編寫logstash 配置文件,在filter{}字段增加multiline 相關配置

        multiline {
            pattern => "^\["
            negate => true
            what => "previous"
        }

重啓logstash……結果logstash 報錯了……
看了下錯誤日誌,顯示的大概內容爲沒有multiline 插件……

安裝logstash-filter-multiline

因爲是離線環境,又到rubygems網站下載了對應的filter-multiline-gem文件做離線安裝,將下載回來的文件放到logstash/vendor/cache目錄下
執行如下命令執行安裝

bin/logstash-plugin install --local vendor/logstash/vendor/cache/logstash-filter-multiline-3.0.4.gem

看到如下輸出即表示安裝成功

Validating /root/logstash-filter-multiline-3.0.4.gem
Installing logstash-filter-multiline

有類似上面信息輸出,即可忽略連接錯誤,如下

Error Bundler::HTTPError, retrying 1/10
Could not fetch specs from https://rubygems.org/

可以查看Gemfile 文件最後一行,有類似如下信息即安裝成功
gem "logstash-filter-multiline", "3.0.4", :path => "vendor/local_gems/ffa5f9f7/logstash-filter-multiline-3.0.4"

驗證

啓動logstash,這次沒有報錯信息了,再看kibana 上的日誌已經合併爲一行

後續

某一條錯誤日誌打印了有1.3k行,日誌又分爲了多條顯示,比對後發現前兩條正好都是501行,懷疑是有默認行數限制,查閱資料驗證了這點懷疑,修改默認行數值解決

默認行數限制

默認行數是在codec 字段,修改如下

        codec => multiline {
            max_bytes => "20MiB"  #修改最大值
            max_lines => 2000 #修改合併行數
            pattern => "^\["
            negate => true
            what => "previous"
        }

完整配置

input{
    file {
        path => ["/logs/error-*.log"]
        type => "error"
        codec => multiline {
            max_bytes => "20MiB"
            max_lines => 2000
            pattern => "^\["
            negate => true
            what => "previous"
        }
        start_position => "beginning"
    }
}

filter {
    if [type] == "error" {
        multiline {
            pattern => "^\["
            negate => true
            what => "previous"
        }
        grok {
            match => {
                "message" => "\[%{LOGLEVEL:loglevel}\] \[%{TIMESTAMP_ISO8601:time}\] \[%{JAVAFILE:class}\] \| (?<info>([\s\S]*))"
            }
           overwrite => ["message"]
        }
    }
}

output {
    if [type] == "error" {
        elasticsearch {
            hosts => ["localhost:9200"]
            index => "error-%{+YYYY-MM}"
        }
    }
}

參考資料

Grok 表達式語法:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
正則:http://manual.macromates.com/en/regular_expressions
行數限制:https://blog.csdn.net/jiao_fuyou/article/details/50350497
Grok Debugger :http://grokdebug.herokuapp.com 需***
http://grok.qiexun.net/ 無需***

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章