Logstash使用mutate.add_字段将副本复制到嵌套字段
我想在Logstash过滤器中复制一个嵌套字段,但找不出正确的语法。 以下是我尝试的: 语法不正确: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 =>
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]}。也许语法改变了?