logstash - 通过转换映射到 json 数组

logstash - map to json array with transformation

我有以下 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"
    }
}

我想按如下方式写入索引(每个地址作为数组中的第一个元素转到不同的文档):

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

附加作业无效。没有错误,也没有做任何事情。
谢谢

您不能在 json 过滤器的目标选项中使用该字段引用。在过去几年的任何版本的 logstash 中,我都希望这会导致 _jsonparsefailure 标记和错误

Exception caught in json filter {:exception=>"Invalid FieldReference: `addresses[0].street`"

如果您将引用更改为 [addresses][0],那么它将 运行 没有错误,但引用将被解释为“addresses”哈希中的“0”条目,而不是地址数组中的第一个条目。

您传入的 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] 字段内,因此它可用但未被输出索引。