神交/ Oniguruma图案从X - 转发,对于报头相匹配的第一个IP

问题描述 投票:1回答:2

对于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地址,否则我将无法对行的其余部分相匹配,如日期或用户代理等。

regex logstash logstash-grok filebeat oniguruma
2个回答
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+数字或逗号。

这样一来,没有额外的数据可以被捕获。


0
投票

由于滤光片的另一页的工作https://serverfault.com/questions/725186/grok-issue-with-multiple-ips-in-nginx-logstash上提到我x_forwarder_for greeping但解决方案中并没有为我工作

© www.soinside.com 2019 - 2024. All rights reserved.