【问题标题】:Regex to correctly parse url from nginx logs正则表达式从 nginx 日志中正确解析 url
【发布时间】:2016-08-11 15:04:10
【问题描述】:

我正在使用 fluentd 使用 tail 插件将 nginx 日志通过管道传输到 elasticsearch。提供了一个正则表达式来解析字段:

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

我试图修改它以进一步将路径细分为服务和端点字段。服务只是 url 的第一部分,而端点是查询参数开始或包含显式 id 的所有内容。这是我想出的:

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

在大多数情况下,这可以正常工作。例如,针对以下 url 运行会生成 service1 的服务字段和 service1/hello/ 的端点

127.0.0.1 - - [10/Aug/2016:10:32:13 +0000] "OPTIONS /service1/hello/6/ HTTP/1.1" 204 0 "http://hello.hello.com" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"

但是,当数字前面没有正斜杠时,这也匹配。一个 url:/service1/hel123lo/6/ 将导致一个端点字段 service1/hel

如何匹配前面只有正斜杠的数字?

【问题讨论】:

  • 数字后跟一个斜线 - \d(?=/)
  • 你的正则表达式中有一个sevice

标签: regex nginx fluentd


【解决方案1】:

忽略你问题中的所有内容,除了最后一句,这似乎是唯一明确的问题:

如何匹配前面只有正斜杠的数字?

试试这个:

(?<=/)\d+

+ 允许多于一位。如果您真的只想要个位数,请将其删除。

【讨论】:

  • 问题的其余部分很关键,因为它解释了我通过命名捕获将 url 拆分为各个部分的方法。我需要捕获整个 url,直到查询参数的开头或前面有正斜杠的数字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多