簡體   English   中英

Logstash grok多行消息

[英]Logstash grok multiline message

我的日志格式如下:

2014-06-19 02:26:05,556 INFO ok
2014-06-19 02:27:05,556 ERROR
 message:space exception
         at line 85
 solution:increase space
          remove files   

有兩種類型的事件:

-log就像第一行一樣

-log在多行上像第二行一樣

我能夠處理一行事件,但我無法處理第二種類型,我想將消息存儲在一個變量中,而解決方案存儲在另一個變量中。

這是我的配置:

input {
 file {
    path => ["logs/*"]
    start_position => "beginning"
    codec => multiline {
                   pattern => "^%{TIMESTAMP_ISO8601} "
                   negate => true
                   what => previous
    }       
 }
}
filter {
 #parsing of one line event
 grok {
 patterns_dir => "./patterns"
 match=>["message","%{TIMESTAMP_ISO8601:timestamp} %{WORD:level} ok"]
 }
#the parsing fail, so we assumed we are in multiline events, now I process them and I am stuck when I am getting to the new line.
if "_grokparsefailure" in [tags] {
 grok {
 patterns_dir => "./patterns"
 match=>["message","%{TIMESTAMP_ISO8601:timestamp} %{WORD:level}\r\n"]
 }
}

}

所以這就是我所做的,我想在我的控制台輸出中有以下內容:

{
"@timestamp" => "2014-06-19 00:00:00,000"
"path" => "logs/test.log"
"level"=>"INFO"
},
{
"@timestamp" => "2014-06-19 00:00:00,000"
"path" => "logs/test.log"
"level"=>"ERROR"
"message" => "space exception at line 85"
"solution"=>"increase space remove files"
}

具體來說,我想得到兩個單詞之間的所有表達式(消息變量的“消息”和“解決方案”,“解決方案”和解決方案變量的事件結束),並且無論表達式是否在一個上或多行。

提前致謝

對於multiline grok,最好使用特殊標志來表示模式字符串:

grok {
    match => ["message", "(?m)%{SYSLOG5424LINE}"]
}

看起來你有兩個問題:

您需要正確組合多行:

filter
{
    multiline
   {
        pattern => "^ "
        what => "previous"
   }
}

這會將以空格開頭的任何行合並到上一行。 你可能最終不得不使用“下一個”而不是“前一個”。

替換換行符

我不相信grok匹配換行符。

通過在過濾器部分中執行以下操作,我解決了這個問題。 這應該 grok部分之前

mutate
{
    gsub => ["message", "\n", "LINE_BREAK"]
}

這使我能夠將多線作為一條大線而不是只匹配到“\\ n”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM