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

supporting different kind of logs with Logstash

我正在尝试使用 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是: root - 信息 - 最佳成绩:35.732

类型 2 是: root - 信息 - 开始实验

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

一个选项是在未定义字段时在 logstash 上添加一个标签,以便能够在 kibana 端轻松进行过滤。 null值只在elasticsearch中插入时设置(在logstash端,该字段未定义)

在你的情况下,这个解决方案看起来像这样:

    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" ] }
            }

    }