Grok/Oniguruma 匹配来自 X-Forwarded-For header 的第一个 IP 的模式
Grok/Oniguruma pattern to match first IP from X-Forwarded-For header
对于 this issue 我正在尝试创建一个 grok 模式,它与 nginx 日志中 X-Forwarded-For header 的第一个 IP 相匹配。
日志行通常如下所示:
68.75.44.178, 172.68.146.54, 127.0.0.1 - - [15/May/2017:12:16:27 +0200] "GET /jobs/24237/it-back-end HTTP/1.1" 301 5 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
第一个 IP 是客户端的实际 IP,这是我要检索的 IP,另外两个来自代理,在我们的例子中是 cloudflare 和 varnish。
我在 https://grokconstructor.appspot.com 上试过的模式看起来像这样:
FIRSTIPORHOST (^%{IPORHOST})(?:,\s%{IPORHOST})*
不幸的是,它匹配所有 IP,尽管没有捕获组,所以我做错了什么?或者有更好的模式吗?
澄清:
使用filebeats将整个日志文件读入弹性搜索,因此我需要以某种方式匹配IP,否则我将无法匹配该行的其余部分,如日期或用户代理等.
您需要在模式开头的 %{IPORHOST:nginx.access.remote_ip}
之后添加 (?:,\s[\d.]+)*
。查看固定表达式:
"%{IPORHOST:nginx.access.remote_ip}(?:,\s[\d.]+)* - %{DATA:nginx.access.user_name} \[%{HTTPDATE:nginx.access.time}\] \"%{WORD:nginx.access.method} %{DATA:nginx.access.url} HTTP/%{NUMBER:nginx.access.http_version}\" %{NUMBER:nginx.access.response_code} %{NUMBER:nginx.access.body_sent.bytes} \"%{DATA:nginx.access.referrer}\" \"%{DATA:nginx.access.agent}\""
(?:,\s[\d.]+)*
非捕获重复组匹配 0+ 次出现:
,
- 逗号
\s
- 一个空格
[\d.]+
- 1+ 位数字或逗号。
这样,就无法捕获额外的数据。
在我的 x_forwarder_for 查询期间,给定的过滤器对我不起作用,但另一页上提到的解决方案有效 https://serverfault.com/questions/725186/grok-issue-with-multiple-ips-in-nginx-logstash
对于 this issue 我正在尝试创建一个 grok 模式,它与 nginx 日志中 X-Forwarded-For header 的第一个 IP 相匹配。 日志行通常如下所示:
68.75.44.178, 172.68.146.54, 127.0.0.1 - - [15/May/2017:12:16:27 +0200] "GET /jobs/24237/it-back-end HTTP/1.1" 301 5 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
第一个 IP 是客户端的实际 IP,这是我要检索的 IP,另外两个来自代理,在我们的例子中是 cloudflare 和 varnish。
我在 https://grokconstructor.appspot.com 上试过的模式看起来像这样:
FIRSTIPORHOST (^%{IPORHOST})(?:,\s%{IPORHOST})*
不幸的是,它匹配所有 IP,尽管没有捕获组,所以我做错了什么?或者有更好的模式吗?
澄清:
使用filebeats将整个日志文件读入弹性搜索,因此我需要以某种方式匹配IP,否则我将无法匹配该行的其余部分,如日期或用户代理等.
您需要在模式开头的 %{IPORHOST:nginx.access.remote_ip}
之后添加 (?:,\s[\d.]+)*
。查看固定表达式:
"%{IPORHOST:nginx.access.remote_ip}(?:,\s[\d.]+)* - %{DATA:nginx.access.user_name} \[%{HTTPDATE:nginx.access.time}\] \"%{WORD:nginx.access.method} %{DATA:nginx.access.url} HTTP/%{NUMBER:nginx.access.http_version}\" %{NUMBER:nginx.access.response_code} %{NUMBER:nginx.access.body_sent.bytes} \"%{DATA:nginx.access.referrer}\" \"%{DATA:nginx.access.agent}\""
(?:,\s[\d.]+)*
非捕获重复组匹配 0+ 次出现:
,
- 逗号\s
- 一个空格[\d.]+
- 1+ 位数字或逗号。
这样,就无法捕获额外的数据。
在我的 x_forwarder_for 查询期间,给定的过滤器对我不起作用,但另一页上提到的解决方案有效 https://serverfault.com/questions/725186/grok-issue-with-multiple-ips-in-nginx-logstash