流畅的apache日志格式,具有多个主机ip

时间:2015-08-13 12:29:16

标签: regex logging

我对fluend日志解析器有一点问题。我有清漆服务器,我在其上设置了 X-Forwarded-For 参数,以满足http请求经过的所有主机堆栈的ip列表。我用它来获取 varnishncsa 日志中的信息。这是log:

的例子
"192.168.79.16, 192.22.10.22, 10.2.2.22 - - [13/Aug/2015:09:50:45 +0000] \"GET http://poc.mydomain.com/panier/payment/payline?notificationType=WEBTRS&token=1KB01BwKWdUhVj1222301439454223514 HTTP/1.1\" 401 0 \"-\" \"Java/1.8.0_45\""

在奥德手中,我想在流利的基础上汇总这些日志。然后当vanishncsa日志使用apache格式时,我使用 apache2 flentd格式进行输入解析,就像在这个配置中一样:

<source>
  type tail
  format apache2
  path /var/log/varnish/varnishncsa.log
  pos_file /var/log/td-agent/tmp/access.log.pos
  tag "apache2.varnish.mydomain.com.access"
</source>

现在的问题是,如果我在日志中只有一个主机ip,但是当有多个IP时,流利的agregator报告&#34;模式不匹配&#34;警告。我的意思是

匹配:

"192.168.79.16 - - [13/Aug/2015:09:50:45 +0000] \"GET http://poc.mydomain.com/panier/payment/payline?notificationType=WEBTRS&token=1KB01BwKWdUhVj1222301439454223514 HTTP/1.1\" 401 0 \"-\" \"Java/1.8.0_45\""

这不匹配:

"192.168.79.16, 192.22.10.22, 10.2.2.22 - - [13/Aug/2015:09:50:45 +0000] \"GET http://poc.mydomain.com/panier/payment/payline?notificationType=WEBTRS&token=1KB01BwKWdUhVj1222301439454223514 HTTP/1.1\" 401 0 \"-\" \"Java/1.8.0_45\""

apache2流利的正则表达式是:

^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$

使用这种时间格式:

%d/%b/%Y:%H:%M:%S %z

我试图找出并发布正确的regx,但尚未找到。

我试过了,但它没有用

 <source>
      type tail
      format format /^(?<host>\,*[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/ 
      time_format %d/%b/%Y:%H:%M:%S %z
      path /var/log/varnish/varnishncsa.log
      pos_file /var/log/td-agent/tmp/access.log.pos
      tag "apache2.varnish.mydomain.com.access"
    </source>

有人可以帮忙吗?并且还给我一个关于fluend解析器模式捕获的好文档,以及测试fulentd正则表达式的好方法。 这Fluentd regular expression editor并没有真正帮助。

它始终生成配置,而不提供测试结果。

感谢。

1 个答案:

答案 0 :(得分:2)

以下是您可以使用的正则表达式,以防您有多个IP:

^(?<host>[^ ]*(?:,\s+[^ ]+)*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$
              ^^^^^^^^^^^^^^

请参阅demo on a good Web regex tester

(?:,\s+[^ ]+)*模式匹配0个或更多(*,个序列,1个或更多个空格(\s+)符号,以及1个或更多个字符以外的字符([^ ]+)。

更安全的表达式如下:

^(?<host>(?:\d+\.){3}\d+(?:,\s*(?:\d+\.){3}\d+)*|-) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$

请参阅Demo 2

(?:\d+\.){3}\d+(?:,\s*(?:\d+\.){3}\d+)*匹配number + . + number + . + number + . + {{1} },使用逗号列出可选的相同模式。