2015-07-14 16 views
7

Dizideki dizili JSON-Message'ım var. "Fasulye" bölmek için bir filtre kullanarakNesne içindeki JSON dizisini bölme

{ 
"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" 
    }] 
} 

:: Birden fazla olayların içine bölmek istiyorum

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

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

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

iyi çalışıyor:

{"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" 
} 

    ... 

da "yöntemleri" ayırmak için Ben bir başka süzgeç ekledim:

Ama sadece bir hata mesajı alıyorum bu şekilde:

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

Ben nesne "fasulye" içeride dizi "yöntemi" erişemez. Şanssız farklı notasyonlar denedim. Diziye erişmek mümkün mü, henüz desteklenmiyor mu?

cevap

4

Aşağıdaki kod istediğini yapması gerektiğini ve her yöntem için bir olay dönmek:

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]" 
     } 
    } 
} 

ikinci koşul kontrolleri İlk yöntem başarılı olup olmadığını ve bir yöntem fasulye içine varsa. Bu yüzden de yöntemler olmadan fasulyeler için çalışır.

+1

Çalışıyor, ancak yöntemsiz fasulyem var. Bu yüzden _if [bean] [method] {..._ ekledim ve şimdi iyiyim, çok teşekkürler. – joerno

+0

Mükemmel, [bean] [method] 'koşulunu yanıtıma ekledim. – hurb

+0

@hurb "Fasülyenin" sadece bir elementi varsa ne olur? Bu kod bu durumda çalışmıyor –