使用Logstash支持不同种类的日志

使用Logstash支持不同种类的日志,logstash,kibana,logstash-grok,Logstash,Kibana,Logstash Grok,我正在尝试使用Logstash收集日志,在同一个文件中有不同类型的日志。 如果日志中存在某些字段,我希望提取这些字段,否则就执行其他操作 input{ file { path => ["/home/ubuntu/XXX/XXX/results/**/log_file.txt"] start_position => "beginning" } } f

我正在尝试使用Logstash收集日志,在同一个文件中有不同类型的日志。 如果日志中存在某些字段,我希望提取这些字段,否则就执行其他操作

input{
        file {
                path => ["/home/ubuntu/XXX/XXX/results/**/log_file.txt"]
                start_position => "beginning"
         }
}
filter {
        grok{
                         match => { "message" => ["%{WORD:logger} %{SPACE}\-%{SPACE} %{LOGLEVEL:level} %{SPACE}\-%{SPACE} %{DATA:message} %{NUMBER:score:float}",
                                "%{WORD:logger} %{SPACE}\-%{SPACE} %{LOGLEVEL:level} %{SPACE}\-%{SPACE} %{DATA:message}"]}
        }
}

output{
         elasticsearch {
                 hosts => ["X.X.X.X:9200"]
        }
        stdout { codec => rubydebug }
}
例如,日志类型1是: 根-信息-最佳成绩:35.732

第二类是: 根-信息-开始实验


我面临的一个问题是,当消息不包含数字时,该字段在创建的JSON中仍然以null形式存在,这使我无法在Kibana中使用所需的功能。

一个选项,就是在logstash上添加一个标记,而该字段未定义为能够在Kibana端轻松过滤。空值仅在elasticsearch中插入时设置(在日志存储端,未定义字段)

在您的情况下,此解决方案如下所示:

    filter {
            grok{
                             match => { "message" => ["%{WORD:logger} %{SPACE}\-%{SPACE} %{LOGLEVEL:level} %{SPACE}\-%{SPACE} %{DATA:message} %{NUMBER:score:float}",
                                    "%{WORD:logger} %{SPACE}\-%{SPACE} %{LOGLEVEL:level} %{SPACE}\-%{SPACE} %{DATA:message}"]}
            }
            if ![score] {
                             mutate { add_tag => [ "score_not_set" ] }
            }

    }

所有那些
%{SPACE}
引用都没有做任何事情-它们捕获了“零个或多个空间”,在本例中,它们都捕获了“零个空间”。如果没有它们,它将更具可读性。您可能希望尝试以
({NUMBER:score:float})结尾合并两个grok模式。$