2015-05-18 16 views
26

Mam pliki dziennika przychodzące do stosu ELK. Chcę skopiować pole (foo) w celu wykonania różnych mutacji na nim, Jednak pole (foo) nie zawsze jest obecne.logstash sprawdź, czy pole istnieje

Jeśli foo nie istnieje, to zostanie utworzony jeszcze yyy, ale przypisany jest ciągiem znaków "%{foo}"

Jak mogę wykonać mutację tylko jeśli pole istnieje?

Próbuję zrobić coś takiego.

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

Odpowiedz

26

"foo" to ciąg literowy.

[foo] to pole.

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

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

Wygląda na to, że to zadziała, ale jest ten błąd, jeśli pole ['foo'] jest boolowskie. https://github.com/elastic/logstash/issues/1867 – spuder

+0

Ten drugi przykład nie działa dla liczb (Logstash 1.5.4). – Newerth

51

Aby sprawdzić, czy foo pole istnieje:

1) dla pól typu liczbowego użyć:

if ([foo]) { 
    ... 
} 

2) W przypadku typów innych niż liczbowe, takie jak logicznej, wykorzystania wyrażenie:

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

to całkiem eleganckie rozwiązanie. Bardzo intuicyjny – alfredocambera

+4

Można go również zanegować w następujący sposób: 'if! (" "W [foo]) {...}' – worldsayshi

+0

Chciałbym awansować +2, gdybym mógł. dzięki! –

11

W Logstash 2.2.2, konstrukcja ("" in [field]) nie wydaje się działać dla mnie.

dla pola nienumerycznego.

+0

+1 To działało lepiej dla mnie z Logstash 6.1.2. Notacja '' "w [pole]' faktycznie dawała dziwne przerywane wyniki – darkwing