Logstash 正则表达式在 if 条件下匹配

Logstash 正则表达式在 if 条件下匹配

在logstash过滤中,我根据不同的错误条件设置了多个标签,并且所有标签都有一个前缀,例如“abc:”

在输出中,我想根据标签中存在的“abc:*”发送电子邮件。

我在阅读文档时没有遇到过这种情况。

大多是这样写的:

if "abc" in [tags] { ... ... }

但是我想让条件与任何带有“abc-*”的标签匹配。有任何想法吗?

答案1

你在寻找这个(这里是 perl 语法)吗?

s/if\s*\"([^\"]*)\"\s*in\s*\[tags\].*/$1:/g;

如果 abc 是一个单词,您可以使用\w代替[^\"]

答案2

@sudobash 好的更新我之前的评论,这不是解决方案而是一个问题。我知道自从提出这个问题以来已经很长时间了,但这里是解决方案,以防将来有人需要它:


如果将鼠标悬停在“tags”字段上,您会看到它应该是一个“String”字段,即不是确实如此,您可以通过以下方式确认:根据官方Elasticsearch 文档,过滤时可以使用以下条件:

equality: ==, !=, <, >, <=, >=
regexp: =~, !~ (checks a pattern on the right against a string value on the left)
inclusion: in, not in

如果你注意的话,你会发现你应该能够使用“regexp”进行字符串比较,但为什么它不适用于“tags”?嗯,答案是因为“tags”不是一个字符串字段,它是一个“数组”字段/对象因此任何比较都必须指向数组的特定位置。

例如,如果您在 Logstash 管道中使用此过滤器:

filter {
  if [tags][0] =~ /foo.*/ {
     mutate { add_tag => "worked" }
  }
}

它将按预期工作,在上面的示例中,如果“tags”的位置 [0] 与正则表达式条件“foo.*”匹配,则新值(“worked”)将添加到标签数组中。

现在,我明白在现实生活中,这不会有用,因为您可能不知道要比较的标签在数组中的位置,对吗?所以,开箱即用,不可能要实现此目的,您必须使用 ruby​​ 过滤器来执行此操作。参考这个帖子

这是一个基本的 ruby​​ 过滤器,它将完全执行我在前面的过滤器示例中所做的操作,这次,它将动态执行:

filter {
  ruby {
    code => '
        mbool = 0
        event.get("tags").each_index { |x|
          if event.get("tags")[x] =~ /foo.*/
            mbool = 1
          end
        }
        if mbool == 1
          event.tag("ruby-worked")
        end
    '
}

当然,这取决于您最终想要完成什么,但我很确定这篇文章会有所帮助。

相关内容