我有日志文件进入 ELK 堆栈。我想复制一个字段 (foo) 以便对其执行各种突变,但是字段 (foo) 并不总是存在。
如果 foo 不存在,那么 bar 仍然被创建,但被分配了文字字符串"%{foo}"
仅当字段存在时,如何执行突变?
我正在尝试做这样的事情。
if ["foo"] {
mutate {
add_field => "bar" => "%{foo}
}
}
我有日志文件进入 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 }}
}
}
在 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" } }
}