2015-07-14 16 views
7

मेरे पास एक सरणी में सरणी वाला JSON-Message है।किसी ऑब्जेक्ट के अंदर JSON सरणी को कैसे विभाजित करें

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

"सेम" विभाजित करने के लिए एक फिल्टर का उपयोग करना:: मैं विभाजित करने के लिए कि कई घटनाओं में चाहते

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

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

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

अच्छी तरह से काम कर रहा है:

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

    ... 

भी अलग करने के लिए "तरीकों" , मैंने एक और विभाजन-फ़िल्टर जोड़ा:

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

लेकिन उस तरह से मैं सिर्फ एक त्रुटि संदेश मिलता है:

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

मैं वस्तु "सेम" अंदर सरणी "विधि" का उपयोग नहीं कर सकते हैं। मैंने भाग्य के साथ अलग-अलग नोटेशन की कोशिश की। क्या सरणी का उपयोग करना संभव है, शायद यह अभी तक समर्थित नहीं है? अगर पहली विधि सफल रहा था

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

दूसरी शर्त चेक और एक विधि अपने सेम के अंदर मौजूद है यदि:

उत्तर

4

निम्नलिखित कोड आप क्या चाहते हैं क्या करना चाहिए और प्रत्येक विधि के लिए एक घटना लौटने। तो यह विधियों के बिना बीन्स के लिए भी काम करता है।

+1

यह काम करता है, लेकिन मेरे पास बिना विधियों के बीन्स हैं। तो मैंने _if [बीन] [विधि] {..._ जोड़ा और अब यह ठीक है, बहुत बहुत धन्यवाद। – joerno

+0

बिल्कुल सही, मैंने अपने जवाब में '[बीन] [विधि]' शर्त जोड़ दी है। – hurb

+0

@hurb क्या होगा यदि "बीन" में केवल एक तत्व है? यह कोड उस मामले में काम नहीं कर रहा है –

संबंधित मुद्दे