Logstash检查字段是否存在



我有日志文件进入ELK堆栈。我想复制一个字段(foo),以便对其执行各种突变,但是字段(foo)并不总是存在。

如果foo不存在,那么bar仍然会被创建,但是会被赋值为字符串"%{foo}"

如何在字段存在的情况下执行突变?

我正在尝试做这样的事情。

if ["foo"] {
  mutate {
    add_field => "bar" => "%{foo}
  }
}

检查字段foo是否存在:

1)对于数字类型字段使用:

 if ([foo]) {
    ...
 }

2)对于非数字类型,如布尔型,字符串使用:

if ("" in [foo]) {
    ...
}

"foo"是一个字面值字符串。

[foo]是一个字段。

# technically anything that returns 'true', so good for numbers and basic strings:
if [foo] {
}
# contains a value
if [foo] =~ /.+/ {
}

在Logstash 2.2.2上,("" in [field])构造似乎不适合我。

if ![field] { }
对于非数值字段

现在是2020年,以上答案都不太正确。自2014年以来,我一直在使用logstash,过滤器中的表达式是,是,将是一件事…

例如,您可能有一个具有false值的布尔字段,并且使用上述解决方案,您可能不知道false是该字段的值还是表达式的结果值,因为该字段不存在。

检查字段是否存在于所有版本的解决方案

我想所有版本的logstash都支持[@metadata]字段。也就是说,这个字段对于输出插件是不可见的,并且只存在于过滤状态。这就是我要解决的问题:

filter {
  mutate {
    # we use a "temporal" field with a predefined arbitrary known value that
    # lives only in filtering stage.
    add_field => { "[@metadata][testField_check]" => "unknown arbitrary value" }
    # we copy the field of interest into that temporal field.
    # If the field doesn't exist, copy is not executed.
    copy => { "testField" => "[@metadata][testField_check]" }
  }

  # now we now if testField didn't exists, our field will have 
  # the initial arbitrary value
  if [@metadata][testField_check] == "unknown arbitrary value" {
    # just for debugging purpouses...
    mutate { add_field => { "FIELD_DID_NOT_EXISTED" => true }}
  } else {
    # just for debugging purpouses...
    mutate { add_field => { "FIELD_DID_ALREADY_EXISTED" => true }}
  }
}

logstash之前版本7.0.0的旧解决方案

在github中查看我的问题。

我一直在努力在logstash表达式很多。我的旧解决方案在版本7之前一直有效。这适用于布尔字段,例如:

filter {
  # if the field does not exists, `convert` will create it with "false" string. If
  # the field exists, it will be the boolean value converted into string.
  mutate { convert => {  "field" => "string" } }
  # This condition breaks on logstash > 7 (see my bug report). Before version 7,
  # this condition will be true if a boolean field didn't exists.
  if ![field] {
    mutate { add_field => { "field" => false } }
  }
  # at this stage, we are sure field exists, so make it boolean again
  mutate { convert => { "field" => "boolean" } }
}

相关内容

  • 没有找到相关文章

最新更新