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}|-),这里面用小括号括起来,前面的?表示如果满足|前面的匹配,就匹配前面的,如果不满足就匹配|后面的,如果是不满足前面的时候就没有这个字段的话,那就|后面什么都不写即可,如果是不满足还有另一种匹配方式的话,就可以在|后面再写%{}匹配其他的格式。