配置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
一样吗? 最佳答案
从语义上看,它们看起来是等效的,但它们有所不同,因为add_field
可能并不总是起作用。replace
是mutate
过滤器的一部分,如果您是looking at the source code of that plugin,您将看到replace会由始终设置一个字段,即使该字段不存在:
def replace(event)
@replace.each do |field, newvalue|
event.set(field, event.sprintf(newvalue))
end
end
add_field
是任何输入和过滤器插件的通用配置,您经常会在某些特定过滤器插件的文档中看到类似以下内容(例如 grok
过滤器):此配置继承自
LogStash::Filters::Base
,它是所有过滤器插件的父类(super class)。这意味着在某些过滤器插件中,为了使add_field
实际上添加字段,过滤器必须成功,否则不添加任何字段。因此,在您的情况下,即使不存在,
mutate/replace
也会始终设置一个字段,并且mutate/add_field
将在运行mutate过滤器的所有操作后添加指定的字段。因此,如果您有一个执行某些特定操作(例如
gsub
)且由于某种原因而失败的mutate过滤器,则不会添加任何字段。关于add_field和replace之间的Logstash差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40752994/