前言
有时您只想在特定条件下过滤或输出事件。为此,您可以使用条件(conditional)。比如在elk系统中想要添加一个type类型的关键字来根据不同的条件赋值,最后好做统计。
条件语法
if EXPRESSION { ... } else if EXPRESSION { ... } else { ... }
比较操作
- 相等:
==
,!=
,<
,>
,<=
,>=
- 正则:
=~
(匹配正则),!~
(不匹配正则) - 包含:
in
(包含),not in
(不包含)
布尔操作
- and
(与), or
(或), nand
(非与), xor
(非或)
一元运算符
表达式可能很长且很复杂。表达式可以包含其他表达式,您可以使用!来取消表达式,并且可以使用括号(...)对它们进行分组。
- -
!
(取反) - -
()
(复合表达式) !()
(对复合表达式结果取反)
示例
如若action是login则mutate filter删除secret字段:
filter { if [action] == "login" { mutate { remove_field => "secret" } } }
若是正则匹配,成功后添加自定义字段:
filter { if [message] =~ /w+s+/w+(/learner/course/)/ { mutate { add_field => { "learner_type" => "course" } } } }
在一个条件里指定多个表达式:
output { # Send production errors to pagerduty if [loglevel] == "ERROR" and [deployment] == "production" { pagerduty { ... } } }
在in条件,可以比较字段值:
filter { if [foo] in [foobar] { mutate { add_tag => "field in field" } } if [foo] in "foo" { mutate { add_tag => "field in string" } } if "hello" in [greeting] { mutate { add_tag => "string in field" } } if [foo] in ["hello", "world", "foo"] { mutate { add_tag => "field in list" } } if [missing] in [alsomissing] { mutate { add_tag => "shouldnotexist" } } if !("foo" in ["hello", "world"]) { mutate { add_tag => "shouldexist" } } }
not in示例:
output { if "_grokparsefailure" not in [tags] { elasticsearch { ... } } }
参考资料: