对于本期,我正在尝试创建一个grok模式,它与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,这是我想要撤回的一个IP,另外两个来自代理,在我们的例子中,cloudflare和varnish。
我在https://grokconstructor.appspot.com上尝试的模式如下所示:
FIRSTIPORHOST (^%{IPORHOST})(?:,\s%{IPORHOST})*不幸的是,它匹配了所有的I,尽管没有捕获组,那么我做错了什么?还是有更好的模式?
Clarification:
如果要使用文件拍将整个日志文件读入弹性搜索,那么我需要以某种方式匹配IP,否则我将无法匹配行的其余部分,比如日期或用户代理等等。
发布于 2017-05-18 12:54:33
您需要在模式开始时在(?:,\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+数字或逗号。这样,就不能捕获额外的数据。
发布于 2019-01-04 07:47:25
在我的x_forwarder_for爬行过程中,给定的过滤器没有对我起作用,但是另一个页面上提到的解决方案对https://serverfault.com/questions/725186/grok-issue-with-multiple-ips-in-nginx-logstash有效。
https://stackoverflow.com/questions/44047463
复制相似问题