我从我的网络服务器进行日志记录时遇到问题,该服务器有一个 elb,然后在 nginx 层前面有一个清漆层。
varnish 已为 X-Forwarded-For 正确设置,并且日志正常通过,并记录了正确的“client.ip”。
但是,nginx 日志在请求中包含完整的 IP 列表。默认的 grok 行为似乎将客户端 IP 设置为列表中的最后一个,即。elb 和 varnish 服务器,这弄乱了我的 nginx 日志的 client.ip 字段。正确的客户端 IP 应该是列表中的第一个(或至少是前几个)。
这是一个例子:
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 grok 调试器似乎不适用于这个查询和我的 grok——但它们在 logstash IE 中工作。不标记 grok 失败。
我试图调试特定部分,但我还没有找到一种方法来使用 IP/IPORHOST 执行我需要的操作,其中有一个逗号分隔的 IP 地址列表。我需要能够指定它应该使用哪个 IP。IE。列表中的第一个应该是 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 的任何想法来覆盖该日志?
不确定您是否仍然遇到此问题,但如果是这样,这对您有用。
鉴于此日志格式:
您指定的 grok 模式没有考虑到该
"$host" "$http_x_forwarded_for"
部分的添加。不知道为什么你的 grok 没有失败,但它应该。
无论如何,此模式将适用于上述日志格式:
并在以下字段中产生结果
请注意,与以前相比,您有几个新字段。
第一个 ("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
来自日志格式。第二个 ("xff_clientip" =>
1.144.97.102
)只是该列表中的第一个 IP,它应该转换为请求的实际源 IP。如果是我,我也会
x_forwarded_for
通过mutate
过滤器运行该字段以将其分解为一个数组:对于最后一部分,Anton Roslov 的解决方案仅匹配“ip1, ip2”和“single-ip”日志行,而不匹配“ip1, ip2, ip3”。
恕我直言,类似
应该做的伎俩。只是检查...
或者
应该是您选择的模式。在 grokdebug.herokuapp.com 中测试。