2014-07-11 1 views
10

J'utilise Logstash pour analyser les journaux de postfix. Je suis principalement concentré pour obtenir des journaux de courrier électronique rebondis à partir des journaux de postfix, et le stocker dans la base de données. Pour obtenir les journaux, je dois d'abord trouver l'ID généré par postfix correspondant à mon ID de message, et en utilisant cet ID, j'ai besoin de trouver le statut d'un e-mail. Pour la configuration suivante, je suis en mesure d'obtenir les journaux.Plusieurs Grok Filters ne stockent pas le premier enregistrement de correspondance de filtre

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

J'utilise suivant si la condition pour stocker les journaux qui correspondent aux motifs:

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

Comme vous l'avez vu, j'utilise deux modèles pour trouver deux journaux différents correspondant d'un fichier journal. Maintenant, je veux différencier les deux modèles basés sur des étiquettes. J'ai donc modifié ma configuration comme suit:

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 
    } 

Maintenant, il ne magasin% {POSTFIXCLEANUP} journaux de motif. Si j'inverse la commande, elle n'enregistre que le modèle% {POSTFIXBOUNCE}. Donc, après avoir enlevé cette condition, j'ai trouvé que le message analysé par le premier filtre avait une balise "_grokparsefailure" et une première balise de filtre, et à cause de cela il ne stocke pas cet enregistrement.

Quelqu'un peut-il me dire ce qu'il faut faire pour rectifier cela? Est-ce que je fais une erreur?

+0

assez que le remove_tag ne se fait si elle correspond à l'événement, de sorte que votre problème est probablement – Alcanzar

+0

Donc, ce que je ne dois faire afin d'obtenir les résultats escomptés? –

Répondre

12

Vous devez protéger le 2ème bloc de grok - c'est-à-dire ne pas l'exécuter si le premier a réussi.

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

Merci l'homme. Cela fonctionne comme j'avais besoin. Merci beaucoup. –

+7

si la déclaration doit être 'if (" BOUNCED "n'est pas dans [tags]) {}' –

Questions connexes