2015-05-13 8 views
5

Ho qualche input logstash in cui utilizzo lo document_id per rimuovere i duplicati. Tuttavia, la maggior parte degli input non ha uno document_id. Il seguente scandaglia l'effettivo document_id attraverso, ma se non esiste, viene accettato come letteralmente %{document_id}, il che significa che la maggior parte dei documenti viene vista come un duplicato l'uno dell'altro. Ecco ciò che il mio blocco di uscita appare come:output logstash su elasticsearch con document_id; cosa fare quando non ho un documento_id?

output { 
     elasticsearch_http { 
      host => "127.0.0.1" 
      document_id => "%{document_id}" 
     } 
} 

ho pensato che potrei essere in grado di utilizzare un condizionale in uscita. Non riesce e l'errore è riportato sotto il codice.

output { 
     elasticsearch_http { 
      host => "127.0.0.1" 
      if document_id { 
       document_id => "%{document_id}" 
      } 
     } 
} 

Error: Expected one of #, => at line 101, column 8 (byte 3103) after output { 
     elasticsearch_http { 
    host => "127.0.0.1" 
    if 

Ho provato alcuni "if" e tutti falliscono, motivo per cui presumo il problema sta avendo un condizionale di qualsiasi tipo in quel blocco. Qui ci sono le alternative che ho provato:

if document_id <> "" { 
if [document_id] <> "" { 
if [document_id] { 
if "hello" <> "" { 

risposta

9

Sei vicino all'idea condizionale ma non puoi posizionarlo all'interno di un blocco di plugin. Fate questo invece:

output { 
    if [document_id] { 
    elasticsearch_http { 
     host => "127.0.0.1" 
     document_id => "%{document_id}" 
    } 
    } else { 
    elasticsearch_http { 
     host => "127.0.0.1" 
    } 
    } 
} 

(. Ma il suggerimento in una delle altre risposte per utilizzare il filtro uuid è troppo buono)

+0

perfetto. Come ho detto a Val, preferisco questo nel caso in cui l'uuid venga omesso accidentalmente. – tedder42

5

Un modo per risolvere questo è quello di assicurarsi un document_id è sempre disponibile. È possibile ottenere ciò aggiungendo un UUID filter nella sezione filtro che creerebbe il campo document_id se non è presente.

filter { 
    if "" in [document_id] { 
     uuid { 
      target => "document_id" 
     } 
    } 
} 

Redatta da suggerimento di Magnus indietro. Grazie!

+0

Il modo tipico per verificare l'esistenza di un campo sarebbe 'se [ document_id] {...} '. –

+0

Val, questa è un'ottima risposta e probabilmente il modo più "corretto" per farlo. Vado con la soluzione di Magnus perché è più sicuro se mi manca l'uuid su un input filtrato. Vorrei poter accettare entrambi, poiché sono entrambe ottime risposte. – tedder42

+0

Sicuro! La cosa migliore è provare entrambi gli approcci e vedere di persona, però;) – Val