Logstash 日志存储检查字段是否存在

Logstash 日志存储检查字段是否存在,logstash,logstash-configuration,Logstash,Logstash Configuration,我有日志文件进入麋鹿堆。我想复制一个字段(foo)以便对其执行各种突变,但是字段(foo)并不总是存在 如果foo不存在,则仍然会创建bar,但会为其分配文本字符串“%{foo}” 只有字段存在时,我如何执行突变 我正试着做这样的事情 if ["foo"] { mutate { add_field => "bar" => "%{foo} } } “foo”是一个文本字符串 [foo]是一个字段 # technically anything that returns

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

如果foo不存在,则仍然会创建bar,但会为其分配文本字符串“%{foo}”

只有字段存在时,我如何执行突变

我正试着做这样的事情

if ["foo"] {
  mutate {
    add_field => "bar" => "%{foo}
  }
}
“foo”是一个文本字符串

[foo]是一个字段

# technically anything that returns 'true', so good for numbers and basic strings:
if [foo] {
}

# contains a value
if [foo] =~ /.+/ {
}

要检查字段foo是否存在:

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

 if ([foo]) {
    ...
 }
if ("" in [foo]) {
    ...
}
2)对于非数值类型(如布尔值),字符串使用:

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

在logstash2.2.2中,
(“[field])
构造似乎对我不起作用

if ![field] { }

是的,对于非数字字段。

现在是2020年,上述答案都不完全正确。自2014年以来,我一直在与logstash合作,filter中的表达式过去、现在和将来都是一件事

例如,您可能有一个值为
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的旧解决方案 检查

我一直在为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" } }
}

看起来这会起作用,但是如果字段['foo']是布尔值,则会出现此错误。后一个例子不适用于数字(logstash1.5.4)。这是一个非常优雅的解决方案。非常直观,它也可以这样被否定:
if!(“[foo]){…}
Nice solution+1I在Logstash 6.1.2中有间歇性行为-@yff下面的答案非常有效,那么nil值呢?+1这对我来说在Logstash 6.1.2中效果更好。[field]符号中的
“”实际上给出了奇怪的间歇性结果