配置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一样吗?

最佳答案

从语义上看,它们看起来是等效的,但它们有所不同,因为add_field可能并不总是起作用。
replacemutate过滤器的一部分,如果您是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/

10-13 09:51