是否可以仅对Logstash中grok的匹配日志行进行索引?

时间:2017-02-02 04:47:28

标签: elasticsearch logstash logstash-grok logstash-configuration

我有一个日志文件,实际上有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 默认为所有这些索引?

我哪里错了?任何帮助都可以得到赞赏。

1 个答案:

答案 0 :(得分:2)

仅为您想要的行编制索引非常简单。

默认情况下,如果grok无法匹配,则会添加标记_grokparsefailure

现在您要做的是检查该标记,然后使用drop filter。

if "_grokparsefailure" in [tags] {
  drop { }
}

sysadmin1138提到您可以通过添加tag_on_failure => ['_INFOFailure' ]

在不同的grok过滤器之间进行选择

对于你的第二个问题,你可以简单地删除该字段。每个过滤器都有一个remove_field选项,但我使用mutate过滤器来指示我正在操作该消息。

mutate {
  remove_field => ["message"]
}