在Nginx Logstash中使用多个IP的Grok问题

我有一个从我的networking服务器,其中有一个ELB,然后在nginx层前的清漆层login问题。

为X-Forwarded-For正确设置清漆,通过logging正确的“client.ip”正常login。

然而,nginx日志正在通过请求中的整个IP列表。 默认的Grok行为似乎将客户端IP设置为列表中的最后一个。 elb和varnish服务器,这混淆了我的client.ip字段的nginx日志。 正确的客户IP应该是列表中的第一个(或者至less是前几个)。

inheritance人一个例子:

172.31.7.219 - - [28/Sep/2015:12:39:56 +1000] "GET /api/filter/14928/content?api_key=apikey&site=website HTTP/1.1" 403 101 "-" "-" "my.website.com" "1.144.97.102, 1.144.97.102, 1.144.97.102, 127.0.0.1, 172.31.26.59"

问题是我没有能够调整grok来处理这样的结果,heroku grokdebugging器似乎并没有为这个查询工作,我的grok – 但他们正在logstash即工作。 不标记grok失败。

我试图debugging的具体部分,但我还没有find一种方法来做我所需要的IP / IPORHOST,其中有一个逗号分隔的IP地址列表。 我需要能够指定应该使用哪个IP。 即。 列表中的第一个应该是client.ip而不是最后一个。

我的nginx grok是:

NGINXACCESS %{IP:clientip} %{NGUSER:ident} %{NGUSER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer})(?:;|) %{QS:agent}

grok的任何想法,以涵盖该日志?

不知道你是否仍然有这个问题,但如果是这样,这是什么将为你工作。

鉴于这种日志格式:

 log_format custom '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$host" "$http_x_forwarded_for"'; 

您指定的grok模式不考虑添加"$host" "$http_x_forwarded_for"部分。

不知道你为什么不失败,但它应该。

无论如何,这种模式将与上面的日志格式一起工作:

 %{IP:clientip} %{NOTSPACE:ident} %{NOTSPACE:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer})(?:;|) %{QS:agent} "%{NOTSPACE:host}" "(?<x_forwarded_for>%{IP:xff_clientip}, .*)" 

并在以下领域的结果

 httpversion 1.1 request /api/filter/14928/content?api_key=apikey&site=website timestamp 28/Sep/2015:12:39:56·+1000 auth - host my.website.com agent "-" x_forwarded_for 1.144.97.102,·1.144.97.102,·1.144.97.102,·127.0.0.1,·172.31.26.59 clientip 172.31.7.219 bytes 101 response 403 xff_clientip 1.144.97.102 ident - port verb GET referrer 

请注意,你有几个新的领域比你以前有。

第一个(“x_forward_for”=> 1.144.97.102, 1.144.97.102, 1.144.97.102, 127.0.0.1, 172.31.26.59 )是最后一组引号的内容,或者$http_x_forwarded_for来自日志格式的$http_x_forwarded_for
第二个(“xff_clientip”=> 1.144.97.102只是该列表中的第一个IP,应该转换为请求的实际源IP。

如果是我,我也会通过mutatefilter来运行x_forwarded_for字段,将其分解成一个数组:

 mutate { split => { "x_forwarded_for" => ", " } }