我有一个日志文件,实际上有INFO
s'和ERROR
s。因此,我尝试使用 grok 过滤器仅匹配需要的INFO
s。所以this是我的日志行的样子。其中很少来自档案。
这就是我的 logstash conf中grok
的样子:
grok {
patterns_dir => ["D:/elk_stack_for_ideabiz/elk_from_chamith/ELK_stack/logstash-5.1.1/bin/patterns"]
match => {
"message" => [
"^TID\: \[0\] \[AM\] \[%{LOGTIMESTAMPTWO:logtimestamp}]%{REQUIREDDATAFORAPP:app_message}",
"^TID\: \[0\] \[AM\] \[%{LOGTIMESTAMPTWO:logtimestamp}]%{REQUIREDDATAFORRESPONSESTATUS:response_message}"
]
}
}
这种模式似乎运作良好。如果需要,我可以提供pattern
。
我有两个问题。一个是我只希望将 grok 匹配的行发送到索引,并阻止Logstash
索引不匹配的行,第二个是阻止Logstash
显示每条ES记录中的消息。
我尝试在匹配下使用覆盖,但仍然没有运气:
overwrite => [ "message" ]
总而言之,我需要在我的indice中看到的是消息(来自上述匹配的app_message,response_message),它应符合上述两个条件。现在,所有的行都被编入索引。
有可能做到这样吗?或者 Logstash 默认为所有这些索引?
我哪里错了?任何帮助都可以得到赞赏。
答案 0 :(得分:2)
仅为您想要的行编制索引非常简单。
默认情况下,如果grok
无法匹配,则会添加标记_grokparsefailure
。
现在您要做的是检查该标记,然后使用drop filter。
if "_grokparsefailure" in [tags] {
drop { }
}
sysadmin1138提到您可以通过添加tag_on_failure => ['_INFOFailure' ]
对于你的第二个问题,你可以简单地删除该字段。每个过滤器都有一个remove_field
选项,但我使用mutate
过滤器来指示我正在操作该消息。
mutate {
remove_field => ["message"]
}