对于this issue我试图创建一个神交模式,这从一个nginx的日志中的X - 转发,对于头部的第一个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,这是一个我想中检索,另外两个来自代理,在我们的例子CloudFlare的和清漆。
我的模式,这是我尝试了https://grokconstructor.appspot.com看起来是这样的:
FIRSTIPORHOST (^%{IPORHOST})(?:,\s%{IPORHOST})*
不幸的是它匹配所有IP,尽管非捕获组,所以我究竟做错了什么?还是有更好的模式?
澄清:
一个使用filebeats读取整个日志文件到弹性搜索,所以我需要以某种方式匹配IP地址,否则我将无法对行的其余部分相匹配,如日期或用户代理等。
您需要在模式的开始(?:,\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+数字或逗号。这样一来,没有额外的数据可以被捕获。
由于滤光片的另一页的工作https://serverfault.com/questions/725186/grok-issue-with-multiple-ips-in-nginx-logstash上提到我x_forwarder_for greeping但解决方案中并没有为我工作