2014-06-19 4 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"] 
} 
} 

} 

, और मैं अपने सांत्वना उत्पादन में है करने के लिए निम्नलिखित चाहते हैं:

यह मेरा config है

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

Concretely, मैं चाहते हैं संदेश चर के लिए दो शब्द ("संदेश" और "समाधान" के बीच सभी अभिव्यक्ति प्राप्त करें, "समाधान" और समाधान चर के लिए ईवेंट का अंत), और इससे कोई फर्क नहीं पड़ता कि अभिव्यक्ति एक या एकाधिक पंक्तियों पर है।

अग्रिम धन्यवाद

+2

तुम सिर्फ' संदेश की कोशिश की है ( *?।)?।? मुझे नहीं पता कि क्या। ग्रोक में नई लाइन से मेल खाता है या नहीं - यदि नहीं, तो आप '। *' – Alcanzar

उत्तर

11

ऐसा लगता है कि आप दो मुद्दे हैं:

आप सही तरीके से अपने Multilines गठबंधन करने के लिए की जरूरत है:

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

यह किसी भी लाइन है कि एक अंतरिक्ष के साथ शुरू होता जोड़ेगा पिछली पंक्ति में आप "पिछले" के बजाय "अगला" का उपयोग कर सकते हैं।

Newlines

बदलें मुझे लगता है कि grok नई पंक्तियां भर से मेल खाता है विश्वास नहीं है।

मुझे आपके फ़िल्टर अनुभाग में निम्नलिखित करके यह मिल गया। यह से पहले जाना चाहिए grok अनुभाग:

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

यह मैं हूँ न कि केवल जब तक "\ n" मिलान से एक बड़ी लाइन के रूप में Multilines grok की अनुमति दी। समाधान :( *) `

+0

के बजाय '[। \ r \ n] *' डाल सकते हैं। प्रश्न में बहुमुखी सेटिंग्स कम या ज्यादा सही हैं और दस्तावेज़ीकरण में क्या हैं। TIMESTAMP_ISO8601 पैटर्न इससे मेल नहीं खा सकता है - यदि ओपी का नमूना गलत क्यों था, तो यह तर्क दिया जाना चाहिए। – makhdumi

+1

'मल्टीलाइन' फ़िल्टर को हटा दिया गया है और इसे [मल्टीलाइन कोड] द्वारा बदला जाना चाहिए (https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html) – exhuma

11

बहु grok का सवाल है, यह पैटर्न स्ट्रिंग के लिए विशेष ध्वज का उपयोग करने के लिए सबसे अच्छा है::

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

दिमाग में ध्यान रखें * multiline कथन के बाद * grok * का उपयोग करने के लिए। –

+1

यह शीर्ष उत्तर होना चाहिए।पूरी तरह से काम करता है और http://grokdebug.herokuapp.com/ पर परीक्षण किया जा सकता है। धन्यवाद – makhdumi

संबंधित मुद्दे