检查数组的Logstash仅适用于多个元素

时间:2016-07-01 13:25:23

标签: logstash logstash-configuration

这主要是因为我无法找到答案,我想知道它是如何工作的/它的工作原理。

以下是我的过滤器示例:

(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元素数组,但我不确定。

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

由于

1 个答案:

答案 0 :(得分:0)

这是一些棘手的行为,但我相信我弄清楚了为什么会这样。这可能是由于使用方括号[]作为数组和字段名称分隔符而创建的一些非预期行为。

当括号之间有多个以逗号分隔的元素时,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"
    ]
}