2015-07-14 8 views
7

Mam komunikat JSON z tablicą w tablicy. Chcę podzielić to na kilka wydarzeń:Jak podzielić tablicę JSON wewnątrz obiektu

{ 
"type": "monitor", 
"server": "10.111.222.333", 
"host": "abc.de", 
"bean": [{ 
    "name": "beanName1", 
    "reseted": "2015-06-05T15:10:00.192Z", 
    "method": [{ 
     "name": "getAllXY", 
     "count": 5, 
     "min": 3, 
     "max": 5 
    }, 
    { 
     "name": "getName", 
     "count": 4, 
     "min": 2, 
     "max": 4 
    }] 
    }, 
    { 
    "name": "beanName2", 
    "reseted": "2015-06-05T15:10:00.231Z", 
    "method": [{ 
     "name": "getProperty", 
     "count": 4, 
     "min": 3, 
     "max": 3 
    }] 
    }, 
    { 
    "name": "beanName3", 
    "reseted": "2015-06-05T15:10:00.231Z" 
    }] 
} 

Korzystanie filtr podzielić "ziarna":

input { 
    stdin { 
    codec => "json" 
    } 
} 

filter { 
    split { 
    field => "bean" 
    } 
} 

output { 
    stdout{codec => "json"} 
} 

działa dobrze:

{"type":"monitor", 
"server":"10.111.222.333", 
"host":"abc.de", 
"bean":{ 
    "name":"beanName1", 
    "reseted":"2015-06-05T15:10:00.192Z", 
    "method":[{ 
    "name":"getAllXY", 
    "count":5, 
    "min":3, 
    "max":5 
    },{ 
    "name":"getName", 
    "count":4, 
    "min":2, 
    "max":4 
    }]}, 
"@version":"1", 
"@timestamp":"2015-07-14T09:21:18.326Z" 
} 

{"type":"monitor", 
"server":"10.111.222.333", 
"host":"abc.de", 
"bean":{ 
    "name":"beanName2", 
    "reseted":"2015-06-05T15:10:00.231Z", 
    "method":[{ 
    "name":"getProperty", 
    "count":4, 
    "min":3, 
    "max":3 
    }]}, 
"@version":"1", 
"@timestamp":"2015-07-14T09:21:18.326Z" 
} 

    ... 

Aby oddzielić również "metody" , Dodałem kolejny filtr dzielony:

split { 
    field => "bean" 
    } 
    split { 
    field => "bean.method" 
    } 

Ale w ten sposób uzyskać jedynie komunikat o błędzie:

Exception in filterworker {"exception"=>#LogStash::ConfigurationError: Only String and Array types are splittable. field:bean.method is of type = NilClass

Nie mam dostępu do tablicy „metoda” wewnątrz obiektu „fasoli”. Próbowałem różnych notacji bez powodzenia. Czy jest możliwy dostęp do tablicy, może nie jest jeszcze obsługiwany?

Odpowiedz

4

Poniższy kod powinien robić to, co chcesz i wrócić jedno zdarzenie dla każdej metody:

filter { 
    if !("splitted_beans" in [tags]) { 
     json { 
      source => "message" 
     } 
     split { 
      field => "bean" 
      add_tag => ["splitted_beans"] 
     } 
    } 

    if ("splitted_beans" in [tags] and [bean][method]) { 
     split { 
      field => "bean[method]" 
     } 
    } 
} 

drugim sprawdza warunek, jeśli pierwsza metoda była skuteczna i czy metoda istnieje wewnątrz fasoli. Więc działa również na fasolę bez metod.

+1

Działa, ale ja mam fasolę bez metod. Więc dodałem _if [bean] [method] {..._ i teraz jest w porządku, wielkie dzięki. – joerno

+0

Doskonale, dodałem warunek '[fasola] [metoda]' do mojej odpowiedzi. – hurb

+0

@hurb Co jeśli "fasola" ma tylko jeden element? Ten kod nie działa w takim przypadku –