logstash-map to json array with transformation

93ze6v8z  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(1)|浏览(420)

我有以下json文件,每行都是不同的json:

{"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元素转到不同的doc):

{
   "addresses": [{"street" : "some address", "city" : "some city"}]
}
{
   "addresses": [{"street" : "some address2", "city" : "some city1"}]
}
{
   "addresses": [{"street" : "some address3", "city" : "some city2"}]
}

附加作业不起作用。没有错误,什么也不做。
谢谢

g6baxovj

g6baxovj1#

不能在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]字段中,这样就可以使用,但不会被输出索引。

相关问题