add_field和replace之间的logstash差异

时间:2016-11-22 22:41:39

标签: logstash logstash-configuration

配置Logstash时,add_fieldreplace之间有什么区别?

从语义上讲,他们可能希望做不同的事情,但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相同吗?

1 个答案:

答案 0 :(得分:4)

在语义上,它们可能看起来相同,但它们是不同的,因为add_field可能并不总是开始。

replacemutate过滤器的一部分,如果您是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)并因某些原因失败,则不会添加任何字段作为结果。