Logstash 中如何判断字段是否存在?
Logstash 的 if [fieldname] 在字段缺失、null 或 false 时为假,不能单独区分键是否存在;嵌套字段写 [a][b]。本文给出条件示例与空字符串的区别。
条件语法:if [field_name] { ... }——字段值不为缺失、null 或 false 时进入分支;if ![field_name] 在这三种情况下执行。注意这与"字段值为空"是两回事。
基本用法
filter {
if [user_id] {
# user_id 非缺失/null/false 才执行
mutate { add_field => { "has_user" => "true" } }
}
if ![referrer] {
# referrer 缺失、null 或 false
mutate { add_field => { "referrer" => "direct" } }
}
# 嵌套字段
if [request][headers][x-forwarded-for] {
# ...
}
}
组合条件
if [status] and [status] >= 500 { ... }
if [level] == "ERROR" or [level] == "FATAL" { ... }
if [tags] and "urgent" in [tags] { ... } # 数组包含
存在 vs 空值
if [field]:排除缺失/null/false;空字符串仍为真;- 判断非空:
if [field] and [field] != ""; - 判断非零/非空数组等需对应表达式。
常见问题(FAQ)
Q:能判断字段值是否为 null 吗? 不要使用未定义的 nil 条件写法。if [field] 无法区分缺失、null 和 false;需要严格区分时可用 Ruby filter,通过 event.to_hash.key?("field") 判断顶层键存在,再用 event.get("field").nil? 判断其值。
Q:嵌套字段写 [a.b] 行吗? [a.b] 表示字面名称含点的顶层字段;嵌套对象 a 中的 b 使用 [a][b]。