Grok / Oniguruma模式匹配来自X-Forwarded-For标头的第一个IP

时间:2017-05-18 12:13:20

标签: regex logstash logstash-grok filebeat oniguruma

对于this issue我正在尝试创建一个grok模式,它与nginx日志中X-Forwarded-For标头中的第一个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,否则我将无法匹配该行的其余部分,如日期或用户代理等。< / p>

2 个答案:

答案 0 :(得分:0)

您需要在模式开头的(?:,\s[\d.]+)*之后添加%{IPORHOST:nginx.access.remote_ip}。请参见固定表达式:

"%{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位数或逗号。

这样,就无法捕获其他数据。

答案 1 :(得分:0)

在我的x_forwarder_for问候期间,给定过滤器对我不起作用,但另一页上提到的解决方案有效https://serverfault.com/questions/725186/grok-issue-with-multiple-ips-in-nginx-logstash