在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
'
}
当然,这取决于您最终想要完成什么,但我很确定这篇文章会有所帮助。