检查数组的 Logstash 仅适用于 1 个以上的元素

Logstash in check for array only works with more than 1 element

这主要是因为我找不到答案,我想知道它是如何工作的works/why。

这是我的过滤器示例:

(1):

if [message] in ["a","b"] {
      mutate {
          add_field => { "tet" => "world2" }
      }
}

这对于 "a" 或 "b" 的消息非常有效。添加了一个新字段。完美。

(2)

if [message] == "a" {
      mutate {
          add_field => { "tet" => "world2" }
      }
}

当消息为 "a" 时工作得很好。

(3)

if [message] in ["a"] {
      mutate {
          add_field => { "tet" => "world2" }
      }
}

这不起作用。如果消息是 "a",检查仍然失败,并且没有字段添加到我的事件中。

为什么上次检查失败了?这是一个错误吗?我想通过打字,logstash 不会认为 "a" 应该是一个 1 元素数组,但我不确定。

如果您还可以指出一些解释此行为的文档:)

谢谢

这是一些棘手的行为,但我相信我已经弄清楚了为什么会发生这种情况。这可能是由于双重使用方括号 [] 作为数组和字段名称分隔符而造成的一些意外行为。

当括号之间有多个以逗号分隔的元素时,logstash 将 ["a","b"] 读取为一个数组。当只有一个元素时,logstash 读取一个字段名,所以检查 in ["a"] 查找名为 "a" 的字段及其值。


证明:

过滤器:

mutate {
    add_field => {'"pop"' => "corn"}
  }
if "corn" in ["pop"] {
 mutate {
    add_tag => ["zing"]
  }
}

输入:

foo

输出:

{
       "message" => "foo",
      "@version" => "1",
    "@timestamp" => "2016-07-05T20:08:44.297Z",
          "host" => "4244ed3ff45a",
       "\"pop\"" => "corn",
          "tags" => [
        [0] "zing"
    ]
}