【发布时间】:2017-10-05 14:36:03
【问题描述】:
我想在 Logstash(2.4 版)中创建一个过滤器,在同一个 grok 中使用不同的匹配项。 我想根据比赛添加不同的标签。 基本上,我收到三种不同的消息模式: “##MAGIC##%消息” “##REAL##%消息” “%信息” 我想做的是:
grok {
match => {"message" => "##MAGIC##%{GREEDYDATA:magic_message}"}
match => {"message" => "##REAL##%{GREEDYDATA:real_message}"}
match => {"message" => "%{GREEDYDATA:basic_message}"}
if [magic_message]{
overwrite => [ "message"]
add_tag => ["Magic"]
} else if [real_message]{
overwrite => [ "message"]
add_tag => ["Real"]
}else{
overwrite => [ "message"]
add_tag => ["Basic"]
}
但是,我得到这个编译失败:
The given configuration is invalid. Reason: Expected one of #, => at line 34, column 9 (byte 900) after filter {
grok {
match => {"message" => "##MAGIC##%{GREEDYDATA:magic_message}"}
match => {"message" => "##REAL##%{GREEDYDATA:real_message}"}
match => {"message" => "%{GREEDYDATA:basic_message}"}
if {:level=>:fatal}
【问题讨论】:
-
为什么要求在同一个 grok 中进行?
-
因为我有三种不同的模式,如果我做三个 grok,每个 grok 的每次不匹配都会导致 _grokparsefailure
-
使用覆盖和 add_tag 运行一次 grok,并将 GPF 设置为类似于“my_grok_missed”的内容。如果找到,请将其删除并运行第二个 grok。如果再次找到,请将其删除并运行第三个 grok。
-
@AlainCollins 您在评论中的建议比接受的答案中的方法更好,为什么?一种方式比另一种表现更好吗?
-
@darkwing,在性能方面,它们可能大致相同,除非覆盖比替换快得多。我想我喜欢将每个案例分开(每个案例都有自己的 grok、overwrite 和 add_tag),而不是在两个不同的阶段进行。