2014-06-19 8 views
18

내 로그는 다음과 같이 포맷 :Logstash grok 수 여러 메시지

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 

이벤트의 2 종류가 있습니다

-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" 
} 

구체적으로 표현식이 하나 또는 여러 행에 있는지 상관없이 두 단어 ("메시지"및 "솔루션"메시지 변수, "솔루션"및 솔루션 변수에 대한 이벤트 끝) 사이의 모든 표현을 가져옵니다.

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

이 공백으로 시작하는 라인을 결합합니다 : 당신은 올바르게 multilines을 결합해야

: 당신이 두 가지 문제를 가지고있는 것처럼 사전에

덕분에

+2

방금'메시지 봤어 : (?. 를 *) 솔루션 :( *)'?.? 나는 모른다. grok의 개행 문자와 일치하는지 아닌지 -'. * '대신'[. \ r \ n] *'을 넣을 수 있습니다. – Alcanzar

답변