0

Ich bin Neuling auf ELK und ich bin eine Config-Datei zu schreiben, die mehrzeilige verwendet, und wir brauchen ein Muster für EingangsdatenKorrigieren Sie ELK mehrzeiligen regulären Ausdruck?

110000|read|<soapenv:Envelope> 
<head>hello<head> 
<body></body> 
</soapenv:Envelope>|<soapenv:Envelope> 
<body></body> 
</soapenv:Envelope> 
210000|read|<soapenv:Envelope> 
<head>hello<head> 
<body></body> 
</soapenv:Envelope>|<soapenv:Envelope> 
<body></body> 
</soapenv:Envelope> 
370000|read|<soapenv:Envelope> 
<head>hello<head> 
<body></body> 
</soapenv:Envelope>|<soapenv:Envelope> 
<body></body> 
</soapenv:Envelope> 

und Konfigurationsdatei verwendet schreiben ist:

input { 
    file { 
    path => "/opt/test5/practice_new/xml_input.dat" 
    start_position => "beginning" 
     codec => multiline 
    { 
    pattern => "^%{INT}\|%{WORD}\|<soapenv:Envelope*>\|<soapenv" 
    negate => true 
    what => "previous" 
    } 
    } 
} 
filter { 
    grok { 
    match => [ "message", "%{DATA:method_id}\|%{WORD:method_type}\|%{GREEDYDATA:request}\|%{GREEDYDATA:response}" ] 
    } 
} 

output { 
    elasticsearch { 
    hosts => "http://localhost:9200" 
    index => "xml" 
    } 
stdout {} 
} 

Aber die Das verwendete Muster passt nicht zu meiner Anforderung.

bitte schlagen Sie mir das richtige Muster vor.

Erwartete Ausgabe:

Für 1. log

method_id- 110000 

method type- 

request- 

response- 

Für 2. log

method id- 210000 

    method type- 

    request- 

    response- 

in ähnlicher Weise für den Rest.

+1

Try [diese] (https://regex101.com/r/lP5xef/1) (die Regex aus dem regulären Ausdruck Feld kopieren, um zu versuchen). –

+0

@Wiktor Stribizew können Sie mir mit dem regulären Ausdruck für das folgende Protokoll helfen – Ritwik

+0

Wenn die Antwort unten mit meiner Regex nicht funktioniert, sollten Sie es nicht akzeptieren. –

Antwort

0

Zunächst Sie haben Ihre mehrzeiliges Muster beheben:

codec => multiline { 
      pattern => "^%{NUMBER:method_id}\|%{DATA:method_type}\|<soapenv:Envelope>" 
      negate => true 
      what => previous 
     } 

Anschließend können Sie das Muster Wiktor in den Kommentaren schlägt vor, verwenden:

(?m)^(?<method_id>\d+)\|(?<method_type>\w+)\|(?<request><soapenv:Envelope>.*?</soapenv:Envelope>)\|(?<response><soapenv:Envelope>.*?</soapenv:Envelope>) 

Folgende Ergebnisse für die drei Protokollzeilen in Ihr Beitrag auf http://grokconstructor.appspot.com: results


Ihre ganze Konfiguration könnte wie folgt aussehen:

input { 
    file { 
    path => "/opt/test5/practice_new/xml_input.dat" 
    start_position => "beginning" 
    codec => multiline { 
      pattern => "^%{NUMBER:method_id}\|%{DATA:method_type}\|<soapenv:Envelope>" 
      negate => true 
      what => previous 
     } 
    } 
} 
filter { 
    grok { 
    match => [ "message", "(?m)^(?<method_id>\d+)\|(?<method_type>\w+)\|(?<request><soapenv:Envelope>.*?</soapenv:Envelope>)\|(?<response><soapenv:Envelope>.*?</soapenv:Envelope>)" ] 
    } 
} 

output { 
    elasticsearch { 
    hosts => "http://localhost:9200" 
    index => "xml" 
    } 
stdout {} 
} 
+0

Wo soll ich das von Wiktor vorgeschlagene Muster verwenden, da ich Fehler bei der Verwendung in Grok bekomme. Oder sollte ich es in mehrzeiligen Muster verwenden? – Ritwik

+0

Ich bekomme Fehler bei der Verwendung des Musters (gegeben von Wiktor) in grok. Wo soll ich das Muster verwenden? – Ritwik

+0

Siehe meine Bearbeitung. Ich kann es nicht selbst testen, da ich hier kein Setup habe, also musste ich mich auf die Ergebnisse von grokconstructor verlassen ... – Phonolog