使用Logstash中的任意键解析JSON对象

时间:2018-01-15 22:33:48

标签: json logstash

考虑来自http://demo.nginx.com/status的示例输出的子集:

{
  "timestamp": 1516053885198,
  "server_zones": {
    "hg.nginx.org": {
      ...  // Data for "hg.nginx.org"
    },
    "trac.nginx.org": {
      ...  // Data for "trac.nginx.org"
    }
  }
}

密钥"hg.nginx.org""track.nginx.org"非常随意,我想将它们解析为Elasticsearch有意义的东西。换句话说,"server_zones"下的每个键都应转换为单独的事件。因此,Logstash应发出以下事件:

[
    {
        "timestamp": 1516053885198,
        "server_zone": "hg.nginx.org",
        ...  // Data for "hg.nginx.org"
    },
    {
        "timestamp": 1516053885198,
        "server_zone": "trac.nginx.org",
        ...  // Data for "trac.nginx.org"
    }
]

这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用ruby过滤器。获取服务器区域并使用要包括的键值对创建新对象。从我的头顶,下面的东西应该工作。显然,您需要将对象映射到索引中的字段。根据您的自定义格式更改剪切,即根据需要构建数组或对象。

filter {    
  ruby {
       code => "  time = event.get('timestamp')
                  myArr = []
                  event.to_hash.select {|k,v| ['server_zones'].include?(k)}.each do |key,value| 
                     myCustomObject = {}                        
                     #map the key value pairs into myCustomObject 
                     myCustomObject[timestamp] = time 
                     myCustomObject[key] = value
                     myArr.push(myCustomObject) #you'd probably move this out based on nesting level
                  end 
                  map['my_indexed_field'] = myArr
                 "
    }
}

在输出部分使用rubydebug进行错误调试

output {
  stdout { codec => rubydebug }
}