elasticsearch logstash-通过转换映射到json数组
我有以下json文件,每一行都是不同的json:elasticsearch logstash-通过转换映射到json数组,elasticsearch,logstash,elasticsearch,Logstash,我有以下json文件,每一行都是不同的json: {"s":"some address","c":"some city"} {"s":"some address1","c":"some city1"} {"s":"some address2","c":"some cit
{"s":"some address","c":"some city"}
{"s":"some address1","c":"some city1"}
{"s":"some address2","c":"some city2"}
我的工作如下:
input {
file {
start_position => "beginning"
path => "/sources/someFile.txt"
}
}
filter {
json {
source => "a"
target => "addresses[0].street"
}
mutate {
remove_field => ["message", "@timestamp", "host", "path", "@version"]
}
}
output {
elasticsearch {
hosts => "http://elasticsearch:9200"
index => "store"
}
}
我希望按如下方式写入索引(每个地址作为数组中的forst元素转到不同的文档):
附加的作业不工作。没有错误,什么都不做。谢谢您不能在json过滤器的目标选项中使用该字段引用。在过去几年的logstash的任何版本中,我都希望这会导致一个jsonparsefailure标记和错误
Exception caught in json filter {:exception=>"Invalid FieldReference: `addresses[0].street`"
如果将引用更改为[addresses][0],则它将正常运行,但该引用将被解释为“addresses”散列中的“0”项,而不是addresses数组中的第一个项
传入的JSON具有错误的字段名,因此必须重命名字段。我认为在ruby过滤器中实现它是最简单的
json { source => "message" target => "[@metadata][json]" }
ruby {
code => '
json = event.get("[@metadata][json]")
event.set("addresses", [ { "street" => json["s"], "city" => json["c"] } ] )
'
}
产生
"addresses" => [
[0] {
"city" => "some city",
"street" => "some address"
}
],
原始JSON放在[@metadata]字段中,因此该字段可用,但不被输出索引。谢谢。你能试着把它和我原来的剧本放在一起吗。我做不到。谢谢,我提供的json和ruby过滤器应该会取代您现有的json过滤器。文件输入将把文件行的文本放在字段[message]中,而不是[A]。如果您以前运行过logstash,它将记录它在sincedb中读取了多少输入文件,因此您需要在文件中附加新行以让logstash读取它们。
Exception caught in json filter {:exception=>"Invalid FieldReference: `addresses[0].street`"
json { source => "message" target => "[@metadata][json]" }
ruby {
code => '
json = event.get("[@metadata][json]")
event.set("addresses", [ { "street" => json["s"], "city" => json["c"] } ] )
'
}
"addresses" => [
[0] {
"city" => "some city",
"street" => "some address"
}
],