[英]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.