配置Logstash时,add_field
和replace
之间有什么区别?
从语义上讲,他们可能希望做不同的事情,但current manual没有任何关于这两个函数如何根据相关领域的存在而有所不同的说法。
示例1:
filter {
mutate {
add_field => { "foo_%{somefield}" => "Hello world, from %{host}" }
}
}
如果该字段已存在,则手册未说明预期的行为是什么。行为是否与replace
相同?
示例2:
filter {
mutate {
replace => { "message" => "%{source_host}: My new message" }
}
}
如果该字段尚不存在,则手册再次没有说明预期的行为是什么。它与add_field
相同吗?
答案 0 :(得分:4)
在语义上,它们可能看起来相同,但它们是不同的,因为add_field
可能并不总是开始。
replace
是mutate
过滤器的一部分,如果您是looking at the source code of that plugin,您会看到替换始终设置字段即使它不存在:
def replace(event)
@replace.each do |field, newvalue|
event.set(field, event.sprintf(newvalue))
end
end
但是, add_field
是任何输入和过滤器插件的通用配置,您经常会在文档中看到类似这样的特定过滤器插件(例如,对于grok
过滤器):
如果此过滤器成功,请向此事件添加任意字段。 [...]
此配置继承自LogStash::Filters::Base
,它是所有过滤器插件的超类。这意味着在某些过滤器插件中,为了add_field
实际添加字段,过滤器必须成功,否则不会添加任何字段。
因此,在您的情况下,mutate/replace
将始终设置一个字段,即使它不存在,mutate/add_field
将在运行mutate过滤器的所有操作后添加指定的字段。
因此,如果您有一个mutate过滤器执行某些特定操作(如gsub
)并因某些原因失败,则不会添加任何字段作为结果。