【问题标题】:Logstash in check for array only works with more than 1 elementLogstash in check for array 仅适用于超过 1 个元素
【发布时间】:2016-07-01 13:25:22
【问题描述】:

这主要是因为我找不到这个问题的答案,我想知道它是如何工作的/为什么工作。

这是我的过滤器示例:

(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 logstash-configuration


    【解决方案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"
        ]
    }
    

    【讨论】:

    • 啊-我尝试了该证明,但无法使其工作:D 我尝试了 add_field => { "\"pop\'" => "test" } 但转义字符未被接受。那完全有道理 - 这可能意味着它是一个错误,我想我会提出它。我看到很多人在 irc 上询问为什么他们的 in 子句不起作用
    • 我提交了一个有关 logstash 的问题,以便记录并知道它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 2011-10-19
    • 2014-04-16
    • 2019-10-15
    • 1970-01-01
    • 2020-06-22
    相关资源
    最近更新 更多