2014-07-11 13 views
10

Sto utilizzando Logstash per analizzare i registri postfix. Sono principalmente concentrato per ottenere i log delle email rimbalzati dai log postfix e archiviarli nel database.Filtri di Grok multipli che non memorizzano il primo record di corrispondenza del filtro

Per ottenere i registri, innanzitutto devo trovare l'ID generato da postfix corrispondente al mio id-messaggio e, utilizzando quell'Id, devo trovare lo stato di un'e-mail. Per la seguente configurazione, sono in grado di ottenere i registri.

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

Sto usando seguente se la condizione per memorizzare i log che corrispondono ai modelli:

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

Come avete visto, io sto usando due modelli per trovare corrispondenti due diversi registri da un file di log.

Ora, voglio differenziare entrambi i modelli in base ai tag. Così ho modificato la mia configurazione come segue:

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 
    } 

adesso, è unico negozio% {} POSTFIXCLEANUP logs modello. Se inverto l'ordine, memorizza solo il pattern% {POSTFIXBOUNCE}.

così, dopo aver rimosso quella condizione se, ho trovato che il messaggio che viene analizzato dal primo filtro ha tag "_grokparsefailure" e il primo tag filtro, e per questo non sta archiviando quel record.

Qualcuno può dirmi che cosa si deve fare per rettificare questo? Sto facendo qualche errore?

+0

abbastanza sicuro che il remove_tag unica viene fatto se corrisponde l'evento, così che è probabile che il problema – Alcanzar

+0

Allora, che cosa devo fare per raggiungere i risultati desiderati? –

risposta

12

È necessario proteggere il 2 ° blocco grok, ovvero non eseguirlo se il primo riesce.

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

Grazie amico. Sta funzionando come avevo bisogno. Grazie mille. –

+7

se l'istruzione deve essere 'if (" BOUNCED "non in [tag]) {}' –