Logstash使用mutate.add_字段将副本复制到嵌套字段

Logstash使用mutate.add_字段将副本复制到嵌套字段,logstash,Logstash,我想在Logstash过滤器中复制一个嵌套字段,但找不出正确的语法。 以下是我尝试的: 语法不正确: mutate { add_field => { "received_from" => %{beat.hostname} } } mutate { add_field => { "received_from" => "%{beat.hostname}" } } beat.hostname不被替换 mutate { add_field =>

我想在Logstash过滤器中复制一个嵌套字段,但找不出正确的语法。 以下是我尝试的:

语法不正确:

mutate {
    add_field => { "received_from" => %{beat.hostname} }
}
mutate {
    add_field => { "received_from" => "%{beat.hostname}" }
}
beat.hostname不被替换

mutate {
    add_field => { "received_from" => "%{[beat][hostname]}" }
}
mutate {
    add_field => { "received_from" => "%[beat][hostname]" }
}
beat.hostname不被替换

mutate {
    add_field => { "received_from" => "%{[beat][hostname]}" }
}
mutate {
    add_field => { "received_from" => "%[beat][hostname]" }
}
beat.hostname不被替换

mutate {
    add_field => { "received_from" => "%{[beat][hostname]}" }
}
mutate {
    add_field => { "received_from" => "%[beat][hostname]" }
}
不可能。如果我给出一个非嵌套字段,它将按预期工作

logstash接收的数据结构如下所示:

{
       "@timestamp" => "2016-08-24T13:01:28.369Z",
             "beat" => {
                "hostname" => "etg-dbs-master-tmp",
                "name" => "etg-dbs-master-tmp"
    },
            "count" => 1,
               "fs" => {
        "device_name" => "/dev/vdb",
              "total" => 5150212096,
               "used" => 99287040,
             "used_p" => 0.02,
               "free" => 5050925056,
              "avail" => 4765712384,
              "files" => 327680,
         "free_files" => 326476,
        "mount_point" => "/opt/ws-etg/datas"
    },
             "type" => "filesystem",
         "@version" => "1",
             "tags" => [
                [0] "topbeat"
              ],
      "received_at" => "2016-08-24T13:01:28.369Z",
    "received_from" => "%[beat][hostname]"
}
编辑:

因为你没有显示你的输入信息,所以我取消了你的输出。在输出中,您试图复制到的字段已经存在,这就是您需要使用replace的原因。如果它不存在,您确实需要使用add_字段。我更新了这两种情况的答案

编辑2:我意识到您的问题可能是访问嵌套的值,所以我也添加了:)

您正在错误/反向使用变异过滤器

第一个错误:

您希望替换字段,而不是添加字段。在文档中,它为您提供了“替换”选项。见:

第二个错误,您使用的是相反的语法。看来你相信这是真的:

"text I want to write" => "Field I want to write it in" 
"myDestinationFieldName" => "My Value to be in the field" 
虽然这是事实:

"text I want to write" => "Field I want to write it in" 
"myDestinationFieldName" => "My Value to be in the field" 
有了这些知识,我们现在可以做到:

mutate {
    replace => { "[test][a]" => "%{s}"}
}
或者,如果要实际添加一个新的不存在的字段:

mutate {
        add_field => {"[test][myNewField]" => "%{s}"}
}
或者使用嵌套字段的值添加新的现有字段:

mutate {
        add_field =>  {"some" => "%{[test][a]}"}
}
或更多详细信息,在我的示例中:

input {
  stdin {
  }
}

filter {
    json {
        source => "message"
    }

    mutate {
        replace => { "[test][a]" => "%{s}"}
        add_field => {"[test][myNewField]" => "%{s}"}
        add_field => {"some" => "%{[test][a]}"}
    }
}

output {
          stdout { codec => rubydebug }
}
本例采用标准输入法并输出到标准输出。它使用json过滤器解析消息,然后使用mutate过滤器替换嵌套字段。我还在嵌套的测试对象中添加了一个全新的字段。 最后创建一个新字段“some”,该字段的值为test

因此,对于这条信息:

{"test" : { "a": "hello"}, "s" : "to_Repalce"}
我们希望将test.a(值:“Hello”)替换为s(值:“to_Repalce”),并添加一个值为s的字段test.myNewField

在我的终端上:

artur@pandaadb:~/dev/logstash$ ./logstash-2.3.2/bin/logstash -f conf2/
Settings: Default pipeline workers: 8
Pipeline main started
{"test" : { "a": "hello"}, "s" : "to_Repalce"}
{
   "message" => "{\"test\" : { \"a\": \"hello\"}, \"s\" : \"to_Repalce\"}",
  "@version" => "1",
"@timestamp" => "2016-08-24T14:39:52.002Z",
      "host" => "pandaadb",
      "test" => {
             "a" => "to_Repalce",
    "myNewField" => "to_Repalce"
},
         "s" => "to_Repalce"
         "some" => "to_Repalce"
}
该值已成功替换

已添加具有替换值的字段“some”

已在嵌套数组中添加新字段

如果您使用add_字段,它将把一个数组转换为一个数组,并将您的值附加到该数组中

希望这能解决你的问题


Artur

你能显示你正在使用的日志存储配置的相关部分吗?我无法复制。对我来说,
add_field=>{”received_from“=>”%{[beat][hostname]}
和logstash-2.2.2我意识到我的答案有点长。。我不明白你的问题是什么。是否要使用嵌套字段的值编写新字段?或者用其他字段的值替换嵌套字段?我在回答中添加了3个不同的用例是的,最后这个表单起作用了:add_field=>{“received_from”=>“%{[beat][hostname]}”。我不记得为什么我觉得它不起作用了。谢谢你的回答@下面的答案非常有用。Wahooo非常令人印象深刻的答案。形式:mutate{add_field=>{“some”=>“%{[test][a]}}}实现了这一点。我想,很多人都很感谢这个完整的答案,应该在日志文档中。我会把这个答案保存在我的收藏夹里!回答得好!我也在寻找相同的语法=>{“some”=>“%{[test][a]}”,以使用嵌套字段,您的答案为我节省了很多时间为什么%{}?这里没有人使用它:这个答案对于如何访问Logstash中的新手的过滤器插件中的嵌套字段帮助很大。@pandaadb我尝试了语法add_field=>{“some”=>“%{[test][a]}”。但它不会返回值。我得到的输出是%{[test][a]}。也许语法改变了?