2014-07-11 8 views
10

Ich verwende Logstash, um Postfix-Protokolle zu analysieren. Ich konzentriere mich hauptsächlich darauf, gebouncte E-Mail-Protokolle aus Postfix-Protokollen zu erhalten und in der Datenbank zu speichern.Mehrere Grok-Filter nicht speichern ersten Filter Match-Datensatz

Um Logs zu bekommen, muss ich zuerst eine ID finden, die von postfix generiert wird, die meiner Message-ID entspricht, und mit dieser ID muss ich den Status einer E-Mail finden. Für die folgende Konfiguration kann ich die Protokolle abrufen.

grok { 
     patterns_dir => "patterns" 
     match => [ 
      "message", "%{SYSLOGBASE} %{POSTFIXCLEANUP}", 
      "message", "%{SYSLOGBASE} %{POSTFIXBOUNCE}" 
     ] 
     named_captures_only => true 
    } 

ich folgende verwende, wenn die Bedingung Protokolle zu speichern, die die Muster entsprechen:

if "_grokparsefailure" not in [tags] { 
    #database call 
} 

Wie Sie gesehen haben, ich zwei Muster bin mit zwei verschiedenen Protokolle aus einer Protokolldatei finden entspricht.

Nun möchte ich beide Muster basierend auf Tags unterscheiden. So habe ich meine Konfiguration wie folgt geändert:

grok { 
     patterns_dir => "patterns" 
     match => [ 
      "message", "%{SYSLOGBASE} %{POSTFIXBOUNCE}" 
     ] 
     add_tag => ["BOUNCED"] 
     remove_tag => ["_grokparsefailure"] 
     named_captures_only => true 
    } 

    grok { 
     patterns_dir => "patterns" 
     match => [ 
      "message", "%{SYSLOGBASE} %{POSTFIXCLEANUP}"    
     ] 
     add_tag => ["INTIALIZATION"] 
     remove_tag => ["_grokparsefailure"] 
     named_captures_only => true 
    } 

Jetzt ist es nur store% {POSTFIXCLEANUP} Muster Protokolle. Wenn ich die Bestellung storniere, wird nur das% {POSTFIXBOUNCE} -Muster gespeichert.

Also, nach dem Entfernen dieser If-Bedingung, fand ich, dass die Nachricht vom ersten Filter analysiert hat "_grokparsefailure" -Tag und erste Filter-Tag, und deshalb speichert es diesen Datensatz nicht.

Kann mir jemand sagen, was getan werden muss, um dies zu beheben? Mache ich einen Fehler?

+0

ziemlich sicher, dass der remove_tag nur gemacht wird, wenn es das Ereignis übereinstimmt, so dass wahrscheinlich Ihr Problem ist – Alcanzar

+0

Also, was muß ich tun, um die gewünschten Ergebnisse zu erzielen? –

Antwort

12

Sie müssen den 2. grok Block schützen - dh führen Sie ihn nicht aus, wenn der erste erfolgreich ist.

if ("BOUNCED" not in [tags]) { 
    grok { 
    patterns_dir => "patterns" 
    match => [ 
     "message", "%{SYSLOGBASE} %{POSTFIXCLEANUP}"    
    ] 
    add_tag => ["INTIALIZATION"] 
    remove_tag => ["_grokparsefailure"] 
    named_captures_only => true 
    } 
} 
+0

Danke Mann. Es funktioniert so, wie ich es brauchte. Ich danke dir sehr. –

+7

if-Anweisung sollte 'if (" BOUNCED "nicht in [Tags]) {}' sein –