2015-07-14 50 views
7

Tôi có một JSON-Message với một mảng trong một mảng. Tôi muốn chia đó vào nhiều sự kiện:Cách tách một mảng JSON bên trong một đối tượng

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

Sử dụng một bộ lọc để tách "đậu":

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

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

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

đang làm việc tốt:

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

    ... 

Để tách cũng là "phương pháp" , Tôi đã thêm một bộ lọc tách khác:

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

Nhưng theo cách đó, tôi chỉ nhận được thông báo lỗi:

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

Tôi không thể truy cập mảng "phương thức" bên trong đối tượng "bean". Tôi đã thử các ký hiệu khác nhau mà không có may mắn. Có thể truy cập vào mảng, có thể nó chưa được hỗ trợ?

Trả lời

4

Các mã sau đây nên làm những gì bạn muốn và gửi lại một sự kiện cho từng phương pháp:

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

sẽ kiểm tra điều kiện thứ hai nếu phương pháp đầu tiên đã thành công và nếu một phương pháp tồn tại bên trong đậu của bạn. Vì vậy, nó hoạt động cho đậu mà không có phương pháp là tốt.

+1

Nó hoạt động, nhưng tôi có đậu mà không có phương pháp. Vì vậy, tôi đã thêm _if [bean] [method] {..._ và bây giờ nó ổn, cảm ơn rất nhiều. – joerno

+0

Tuyệt vời, tôi đã thêm điều kiện '[bean] [method]' vào câu trả lời của mình. – hurb

+0

@hurb Nếu "đậu" chỉ có một phần tử thì sao? Mã này không hoạt động trong trường hợp đó –

Các vấn đề liên quan