2014-10-20 7 views
16

मेरे पास एक दूरस्थ मशीन है जो मल्टीलाइन घटनाओं को जोड़ती है और उन्हें lumberjack प्रोटोकॉल में भेजती है।मैं grok/logstash में एक नई लाइन से कैसे मेल करूं?

{ 
    "message" => "2014-10-20T20:52:56.133+0000 host 2014-10-20 15:52:56,036 [ERROR ][app.logic  ] Failed to turn message into JSON\nTraceback (most recent call last):\n File \"somefile.py", line 249, in _get_values\n return r.json()\n File \"/path/to/env/lib/python3.4/site-packages/requests/models.py\", line 793, in json\n return json.loads(self.text, **kwargs)\n File \"/usr/local/lib/python3.4/json/__init__.py\", line 318, in loads\n return _default_decoder.decode(s)\n File \"/usr/local/lib/python3.4/json/decoder.py\", line 343, in decode\n obj, end = self.raw_decode(s, idx=_w(s, 0).end())\n File \"/usr/local/lib/python3.4/json/decoder.py\", line 361, in raw_decode\n raise ValueError(errmsg(\"Expecting value\", s, err.value)) from None\nValueError: Expecting value: line 1 column 1 (char 0), Failed to turn message into JSON" 
} 

जब मैं

grok {   
    match => [ "message", "%{TIMESTAMP_ISO8601:timestamp} \[%LOGLEVEL:loglevel}%{ SPACE}\]\[%{NOTSPACE:module}%{SPACE}\]%{GREEDYDATA:message}" ] 
} 

GREEDYDATA साथ संदेश मिलान करने का प्रयास के रूप में लगभग लालची के रूप में मैं चाहूँगा नहीं है:

क्या में आता है कुछ है कि इस तरह दिखता है है।

तो फिर मैं gsub का उपयोग करने की कोशिश की:

mutate { 
    gsub => ["message", "\n", "LINE_BREAK"] 
} 
# Grok goes here 
mutate { 
    gsub => ["message", "LINE_BREAK", "\n"] 
} 

लेकिन यह है कि एक के बजाय

The Quick brown fox 
jumps over the lazy 
groks 

मैं

The Quick brown fox\njumps over the lazy\ngroks 

तो मिल गया ...

काम नहीं किया

मैं या तो कैसे जोड़ूं मेरे डेटा पर वापस आने के लिए, GREEDYDATA मेरी न्यूलाइन से मेल करें, या किसी अन्य तरीके से मेरे संदेश के प्रासंगिक भाग को पकड़ें?

+1

http://stackoverflow.com/questions/24307965/logstash-grok-multiline-message का डुप्लिकेट की तरह लग रहा। –

+0

@ मैग्नस बैक मूल रूप से हां, हालांकि उस प्रश्न को न्यूलाइन के बारे में परवाह नहीं है, लेकिन मैं * परिणामस्वरूप संदेश में न्यूलाइन की मौजूदगी की आवश्यकता है। –

उत्तर

48

सभी GREEDYDATA है .* है, लेकिन . न्यू लाइन से मेल नहीं खाता है, तो आप (?<message>(.|\r|\n)*) साथ %{GREEDYDATA:message} की जगह है और यह वास्तव में एक लालची होने के लिए मिल सकता है।

+0

'(? (। | \ R | \ n) *) 'यह किया! 20 टैब खुले थे और यहां मुझे यह बहुत अधिक उल्लिखित उत्तर में नहीं मिला। आपका बहुत बहुत धन्यवाद। –

+1

'(। | \ R | \ n) *' सबसे दुर्भाग्यपूर्ण पैटर्न में से एक है जो पूर्ण बुराई है क्योंकि यह प्रदर्शन हत्यारा पैटर्न है। '.' के साथ किसी भी चरित्र से मेल खाने के लिए, ओनिगुरुमा में उचित संशोधक का उपयोग करें, यह' (? M) 'है। पीसीआरई और पीसीआरई से संबंधित स्वादों में, '(? एस)' का उपयोग करें। जेएस में, एक बिंदु के बजाय '[^]' या '[\ s \ S]' का उपयोग करें। –

16

शुरुआत करने के लिए regex ध्वज जोड़ना मिलान नई-पंक्तियों के लिए अनुमति देता है:

match => [ "message", "(?m)%{TIMESTA... 
+0

धन्यवाद। यह gsub जैसी चीजों के लिए भी काम करता है, न कि सिर्फ grok। उदाहरण के लिए। एक संदेश फ़ील्ड (सक्रिय निर्देशिका से भेजा गया) से पहली पंक्ति निकालने के लिए इनपुट: '" संदेश "=>" कंप्यूटर ने किसी खाते के लिए प्रमाण-पत्र सत्यापित करने का प्रयास किया। \ r \ n \ r \ n प्रमाणीकरण पैकेज: \ tMICROSOFT_AUTHENTICATION_PACKAGE_V1_0 \ आर \ n' कोड: 'gsub => [" संदेश ","^(? एम) ([^ \ r] *)। * "," \ 1 "]' आउटपुट: '" संदेश "= > "कंप्यूटर ने किसी खाते के लिए क्रेडेंशियल्स को सत्यापित करने का प्रयास किया।" –

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