2015-05-18 24 views
26

I file di registro arrivano in uno stack ELK. Voglio copiare un campo (foo) per eseguire varie mutazioni su di esso, tuttavia il campo (foo) non è sempre presente.logstash controlla se il campo esiste

Se foo non esiste, quindi bar viene comunque creato, ma è assegnata la stringa letterale "%{foo}"

Come posso eseguire una mutazione solo se esiste un campo?

Sto provando a fare qualcosa di simile.

if ["foo"] { 
    mutate { 
    add_field => "bar" => "%{foo} 
    } 
} 

risposta

26

"foo" è una stringa letterale.

[foo] è un campo.

# technically anything that returns 'true', so good for numbers and basic strings: 
if [foo] { 
} 

# contains a value 
if [foo] =~ /.+/ { 
} 
+4

Sembra che questo potrebbe funzionare, ma c'è questo bug se il campo ['foo'] è un booleano. https://github.com/elastic/logstash/issues/1867 – spuder

+0

L'ultimo esempio non funziona con i numeri (Logstash 1.5.4). – Newerth

51

Per controllare se campo foo esiste:

1) Per i campi di tipo numerico Utilizzare:

if ([foo]) { 
    ... 
} 

2) Per i tipi diversi numerico come booleana, uso stringa:

if ("" in [foo]) { 
    ... 
} 
+0

questa è una soluzione piuttosto elegante. Molto intuitivo – alfredocambera

+4

Inoltre, può essere negato in questo modo: 'if! (" "In [foo]) {...}' – worldsayshi

+0

invierei +2 se potessi. grazie! –

11

su Logstash 2.2.2, il costrutto ("" in [field]) non sembra funzionare per me.

if ![field] { } 

, per un campo non numerico.

+0

+1 Questo ha funzionato meglio con Logstash 6.1.2. La notazione "" "in [field]' ha dato risultati strani intermittenti – darkwing

Problemi correlati