使用logstash grok解析x-forwarder log

x-forwarder.log中的特点是:

前面第一个ip是client,后面的ip都是proxy,proxy可以有多个。

logstash conf:

if "," in [message]{
    grok{
        match => {
            "message" => "%{IP:client}(?:, %{IP:proxy1}|)(?:, %{IP:proxy2}|)(?:, %{IP:proxy3}|) %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{GREEDYDATA:request}(?: HTTP\/%{NUMBER:http_version}|)\" %{NUMBER:response_code} (?:%{NUMBER:bytes}|-)"
        }
    }
}
else{
    grok{
        match => {
            "message" => "(?:%{IP:client}|-) %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{GREEDYDATA:request}(?: HTTP\/%{NUMBER:http_version}|)\" %{NUMBER:response_code} (?:%{NUMBER:bytes}|-)"
}

有的情况下会根据情况有不同的正则匹配原则,类似于三目运算的表达方法。(?:%{IP:client}|-),这里面用小括号括起来,前面的?表示如果满足|前面的匹配,就匹配前面的,如果不满足就匹配|后面的,如果是不满足前面的时候就没有这个字段的话,那就|后面什么都不写即可,如果是不满足还有另一种匹配方式的话,就可以在|后面再写%{}匹配其他的格式。

你可能感兴趣的:(elk)