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

时间:2015-05-08 09:11:02

标签: json logstash

我正在使用最新的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)为什么字段结果在结果中出现两倍? 2)如果有嵌套数组,它应该如何在logstash configure中引用?

非常感谢!

.. Petera

1 个答案:

答案 0 :(得分:2)

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

在您的示例中,您已使用此部分完成此操作:

filter {
        json {
                source => "message"

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

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

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

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

我怀疑你关于数组的问题在这一点上变得毫无意义,因为你可能不需要嵌套数组,因此,不需要解决它,但万一你这样做,我相信你可以这样做:

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