我有一个从我的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" => ", " } }