在 Logstash 中使用 Grok 在增强的 Apache 日志解析上添加自定义字段

Add custom field on augmented Apache log parsing with Grok in Logstash

这是我的问题:假设我有一些标准的 Apache 日志,如下所示:

IP1 IP2 - - [13/Jun/2016:14:45:05 +0200] "GET /page/requested.html HTTP/1.1" 200 4860 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0"

我可以使用 Logstash 的实际配置成功解析这些日志:

input {
    file {
        path => '/home/user/logsDir/*'
    }
}

filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
}

output {
    elasticsearch { }
    stdout { codec => rubydebug }
}

但是在这些日志上,我应用了一些机器学习算法并给了它们 score。所以新的日志行看起来像这样:

IP1 IP2 - - [13/Jun/2016:14:45:05 +0200] "GET /page/requested.html HTTP/1.1" 200 4860 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0" 0.00950628507703

注意行尾的0.00950628507703,才是实际的score

现在,我想解析这一行,以便我可以使用 score 在 Kibana 中进行可视化(Logstash 集成在整个 ELK 堆栈中)。因此,如果分数可以解析为浮点数,那就太好了。

注意: 我可以将分数放在标准 Apache 日志消息之前或之后,并在两者之间插入任何类型的字符(目前它只是一个 space ).

知道如何解决这个问题吗?

提前致谢!

终于找到处理方法了。我在乐谱前加了一点关键词:pred

所以我的台词是这样的:

IP1 IP2 - - [13/Jun/2016:14:45:05 +0200] "GET /page/requested.html HTTP/1.1" 200 4860 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0" pred:0.00950628507703

我将此配置用于 logstash :

input {
    file {
        path => '/home/user/logsDir/*'
        start_position => "beginning"
    }
}

filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG} pred:%{NUMBER:prediction_score}"}
    }
# I convert the score into a float in order to vizualise it in Kibana
     mutate {
        convert => {"prediction_score" => "float"}
     }
}

output {
    elasticsearch { }
    stdout { codec => rubydebug }
}

如果您遇到同样的问题,我希望这对您有所帮助!

干杯!