logstash nginx 模式在 _grokparsefailure 中显示结果

logstash nginx pattern thows the result in _grokparsefailure

我有一个在 grokcontructor 中成功测试的 nginx patteer,但是当将它添加到 logstash 1.5.3 时,日志确实以 _grokparsefailure 结尾

这是我的示例 access.log:

207.46.13.34 - - [14/Aug/2015:18:33:50 -0400] "GET /tag/dnssec/ HTTP/1.1" 200 1961 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)" "-"

这里是 nignx 模式:

NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:clientip} %{NGUSER:indent} %{NGUSER:agent} \[%{HTTPDATE:timestamp}] "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:answer} %{NUMBER:byte} "%{URI:referrer}" %{QS:referee} %{QS:agent}

我的 logstash.conf 看起来像这样:

input {
        lumberjack {
                port => 5000
                type => "logs"
                ssl_certificate => "/etc/pki/tls/certs/z0z0.tk.crt"
                ssl_key => "/etc/pki/tls/private/z0z0.tk.key"
        }
}
filter {
        if [type] == "nginx-access" {
                grok {
                        match => { "message" => "${NGINXACCESS}" }
                }
                geoip {
                        source => "clientip"
                        target => "geoip"
                        database => "/etc/logstash/GeoLiteCity.dat"
                        add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
                        add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
                }
                mutate {
                        convert => [ "[geoip][coordinates]", "float" ]
                }
        }
}
output {
        stdout {
                codec => rubydebug
        }
        elasticsearch {
                host => "172.17.0.5"
                cluster => "clustername"
                flush_size => 2000
        }
}

您正在尝试使用模式 URI 将“-”匹配到字段 referrer 中。不幸的是,“-”不是 URI 模式中的有效字符,它需要类似 "http://..."

的字符

有匹配字符串或连字符的模式示例(如内置 COMMONAPACHELOG 的一部分):

 (?:%{NUMBER:bytes}|-)

您可以根据自己的模式进行调整。

感谢 Alain 的建议,我已经重新创建了模式,但是在 /opt/logstash/pattern/nginx 中没有用,所以我将它移到了 logstash.conf 中,它可以工作,它看起来像这样:

if [type] == "nginx-access" {
                grok {
                        match => { 'message' => '%{IPORHOST:clientip} %{NGUSER:indent} %{NGUSER:agent} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{URIPATHPARAM:request}(?: HTTP/%{NUMBER:httpversion})?|)\" %{NUMBER:answer} (?:%{NUMBER:byte}|-) (?:\"(?:%{URI:referrer}|-))\" (?:%{QS:referree}) %{QS:agent}' }
                }
}