2016-06-29 13 views
0

Meine Protokolldatei beginnt wie folgt:Logstash Basic Multiline Filter funktioniert nicht?

Node Name: StackOverflow 
Node IP: 127.0.0.1 
Logs: the name of my log 
Logs Date: From 2016-06-12 To 2016-06-14 
... 
... 

Ich versuche, alle diese Zeilen, indem Sie diese in meinem conf in einem Filter zu verbinden:

input { 
    file { 
    path => '[...]' 
    start_position => beginning 
    ignore_older => 0 
    codec => multiline { 
     pattern => "Log|Node" 
     negate => "false" 
     what => "previous" 
    } 
    } 
} 

output { 
    stdout { codec => rubydebug } 
} 

Dabei habe ich einfach das bekommen Nachricht "{: timestamp =>" 2016-06-29T12: 51: 28.876000-0700 ",: message =>" Hauptleitung der Pipeline gestartet "}" und nichts wird gedruckt. Wenn ich das Muster ändere, um nur "Log" oder "Node" zu sein, bekomme ich einige Ergebnisse, aber offensichtlich nicht genau das, was ich will. Das scheint sehr einfach zu sein, aber ich stecke fest. Alles was ich vermisse?

Antwort

0

Der Grund dafür ist, hängt mit diesem Muster ist, weil das Muster alle Zeilen übereinstimmt, so versucht es, sie alle zu vorherigen Zeilen, die nicht mit dem Muster übereinstimmen, die nicht vorhanden sind. Der mehrzeilige Codec sollte nicht mit allen Zeilen übereinstimmen. Er sollte entweder nur mit der Begrenzungslinie (Anfangs- oder Endzeile) eines mehrzeiligen Protokolls oder mit jeder Zeile, die kein Trennzeichen ist, übereinstimmen. Wenn Sie alles zusammenpassen, wird es nur alle Ihre Linien in einem großen Ereignis verbinden.

Wenn alle Ihre Protokolle mit Node Name beginnen könnten Sie Ihr Muster zu

ändern
pattern => "^Node Name" 

^ entspricht einer Linie Anfang an, um sicherzustellen, dass ein Protokoll mit den Worten Knotenname in der Mitte der dies nicht verderben.

und setzen

negate => "true" 

Welche werden alle Linien verbinden, die über ihnen nicht mit „Knotenname“ der Zeile beginnen. Zeilen, die mit "Knotenname" beginnen, stimmen mit der Regex überein und werden daher nicht mit Zeilen über ihnen verknüpft, wodurch separate Ereignisse begrenzt werden.

Referenz: https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html

+0

Ich bin immer noch nicht sicher, ob ich das Problem verstehe, ich möchte alle diese 4 Zeilen zusammenfügen. Ich denke nicht, dass das Hinzufügen von^zu diesem Thema beigetragen hat. Warum funktioniert das oder Statement nicht? – Stealthrider

+0

Editiert für ein wenig mehr Klarheit, habe ich angegeben, warum Ihr Muster nicht am Anfang meiner Antwort funktioniert –

+0

Auch es tut nicht weh, die vorgeschlagene Lösung zu versuchen, bevor Sie annehmen, es wird nicht funktionieren;) –

0

Wenn ich dein Problem richtig verstanden habe, wollen Sie nur die Zeilen mit Node IP:, Logs: und Logs Date: zu den Linien mit Node Name: Anfang Anfang verbinden.

Sie können diese mehrzeilige verwenden:

multiline { 
    pattern => "(Node IP:)|(Logs:)|(Logs Date:)" 
    negate => "false" 
    what => "previous" 
} 

Es wird die erste Zeile mit Node Name: nicht überein, aber der andere sein wird.