Logstash 中如何判断字段是否存在?

Logstash 的 if [fieldname] 在字段缺失、null 或 false 时为假,不能单独区分键是否存在;嵌套字段写 [a][b]。本文给出条件示例与空字符串的区别。

最佳实践
Logstash 中如何判断字段是否存在?封面

条件语法: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]。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台