gpt4 book ai didi

Logstash 使用 mutate.add_field 复制一个嵌套字段

转载 作者:行者123 更新时间:2023-12-04 01:36:11 30 4
gpt4 key购买 nike

我想在 Logstash 过滤器中制作一个嵌套字段的副本,但我无法弄清楚正确的语法。
这是我的尝试:

不正确的语法:

mutate {
add_field => { "received_from" => %{beat.hostname} }
}

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

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

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]"
}

最佳答案

编辑:

由于您没有显示您的输入消息,因此我处理了您的输出。在您的输出中,您尝试复制到的字段已经存在,这就是您需要使用替换的原因。如果它不存在,您确实需要使用 add_field。我更新了这两种情况的答案。

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

您正在错误/向后使用 mutate 过滤器。

第一个错误:

您想替换一个字段,而不是添加一个字段。在文档中,它为您提供了“替换”选项。见:https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html#plugins-filters-mutate-replace

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

"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.a

所以对于这条消息:
{"test" : { "a": "hello"}, "s" : "to_Repalce"}

我们想将 test.a (value: "Hello") 替换为 s (Value: "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"
}

该值已成功替换。

添加了带有替换值的字段“一些”

添加了嵌套数组中的新字段。

如果您使用 add_field,它会将 a 转换为数组并将您的值附加到那里。

希望这能解决您的问题,

阿图尔

关于Logstash 使用 mutate.add_field 复制一个嵌套字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39124087/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com