考虑来自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"
}
]
这样做的最佳方式是什么?
答案 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 }
}