2015-04-02 107 views
1

我嘗試在Grok過濾器中使用多行,但其工作不正常。Logstash - grok multiline

我的日誌是

H3|15:55:04:760|exception|not working properly 
message:space exception 
at line number 25 

我的conf文件

input { file { 

    path => "logs/test.log" 
    start_position => beginning 
    sincedb_path => "/dev/null" 
    }} 
filter{ 

multiline { 

    pattern => "^(\s|[A-Z][a-z]).*" 
    what => "previous" 
    } 
if [message] =~ /H\d+/{ 

grok { 

match => ["message", "(?m)%{USERNAME:level}\|%{TIME:timestamp}\|%{WORD:method}\|%{GREEDYDATA:error_Message}" ] 
    } 
    } 

    else { 

    grok { 

match => ["message", "(?m)%{GREEDYDATA:error_Message}" ] 
    } 
    } 
    } 

output {elasticsearch { host => "localhost" protocol => "http" port => "9200" }} 

我能夠處理日誌文件的第一行,但日誌文件的第二行不工作,我想使用多

輸出我想有

{ 

"@timestamp" => "2014-06-19 00:00:00,000" 
"path" => "logs/test.log" 
"level"=>"H3" 
"timestamp"=>15:55:04:760 
"method"=>exception 
"error_message"=>not working properly 
}, 
{ 
"@timestamp" => "2014-06-19 00:00:00,000" 
"path" => "logs/test.log" 
"error_message" => "space exception at line 25" 
} 

請幫助我獲得所需的輸出。

+0

你認爲你的正則表達式匹配了什麼? 「^(\ s | [A-Z] [a-z])*」 – 2015-04-02 16:16:21

+0

嗨,Alain是logstash和這個多行的新手,我認爲它會檢查第一個字母是從空格開始 – raj 2015-04-06 09:29:25

回答

1

你的多行配置說:「如果我找到這種模式,請保留它的前一行」。

您的模式「^(\ s | [A-Z] [a-z])。」「要麼是空格,要麼是大寫字母后跟小寫字母,然後是其他東西。

所以,「foo」或「California」會匹配,但「H3」不會。

我建議你多表達的開始相匹配的模式,並使用「否定」功能有不匹配的圖案線條都加盟原線路:

filter { 
    multiline { 
     pattern => "^[A-Z][0-9]\|" 
     negate => 'true' 
     what => 'previous' 
    } 
    } 
} 

這會採取「H3 |」行作爲開始,並加入所有其他行。根據行開始處的值範圍,您可能需要編輯正則表達式。