Logstash 过滤器解析 json 文件结果一个双字段

Logstash filter parse json file result a double fields

我使用的是最新的 ELK(Elasticsearch 1.5.2、Logstash 1.5.0、Kibana 4.0.2) 我有一个问题

样本.json

{ "field1": "This is value1", "field2": "This is value2" }

longstash.conf

input {
   stdin{ }
}

filter {
        json {
                source => "message"
                add_field =>
                {
                        "field1" => "%{field1}"
                        "field2" => "%{field2}"
                }
        }
}

output {
   stdout { codec => rubydebug }
   elasticsearch {
      host => "localhost"
      index => "scan"
   }
}

输出:

{
       "message" => "{ \"field1\": \"This is value1\", \"field2\": \"This is value2\" }",
      "@version" => "1",
    "@timestamp" => "2015-05-07T06:02:56.088Z",
          "host" => "myhost",
        "field1" => [
        [0] "This is value1",
        [1] "This is value1"
    ],
        "field2" => [
        [0] "This is value2",
        [1] "This is value2"
    ]
}

我的问题是1)为什么字段结果在结果中出现了double? 2)如果有嵌套数组,在logstash配置中应该如何引用?

非常感谢!

..彼得拉

我认为您误解了 json 过滤器的作用。当您通过 json 过滤器处理字段时,它将查找字段名称和相应的值。

在你的例子中,你已经完成了这部分:

filter {
        json {
                source => "message"

然后您添加了一个名为 "field1" 的字段,其中包含字段 "field1" 的内容,因为该字段已经存在,您刚刚将相同的信息添加到已经存在的字段中,它有现在变成一个数组:

                add_field =>
                {
                        "field1" => "%{field1}"
                        "field2" => "%{field2}"
                }
        }
}

如果您将代码简化为以下内容应该没问题:

filter {
        json {
                source => "message"
        }
}

我怀疑你关于数组的问题在这一点上变得没有实际意义,因为你可能不需要嵌套数组,因此不需要解决它,但如果你这样做,我相信你可以做到像这样:

[field1][0]
[field1][1]