【问题标题】:Logstash difference between add_field and replaceLogstash add_field 和 replace 的区别
【发布时间】:2016-11-22 22:41:39
【问题描述】:

配置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 看起来像是在附加值。我问了这个问题,因为我希望得到关于预期行为的更官方/记录在案的答案。

标签: logstash logstash-configuration


【解决方案1】:

在语义上,它们可能看起来相同,但它们是不同的,因为 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,它是所有过滤器插件的超类。这意味着在某些过滤器插件中,要让add_field真正添加字段,过滤器必须成功,否则不会添加任何字段。

所以在你的情况下,mutate/replace 将始终设置一个字段,即使它不存在,mutate/add_field 将在运行 mutate 过滤器的所有操作后添加指定的字段。

因此,如果您有一个 mutate 过滤器执行某些特定操作(如 gsub)并且由于某种原因失败,则不会添加任何字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-19
    • 2012-06-05
    • 2012-04-28
    • 1970-01-01
    • 2021-09-22
    • 2013-09-09
    • 2014-09-04
    相关资源
    最近更新 更多