正则表达式从nginx日志中正确解析url

时间:2016-08-11 15:04:11

标签: regex nginx fluentd

我正在使用流畅的方法使用tail插件将nginx日志传递给elasticsearch。提供了一个正则表达式来解析字段:

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

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

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

在大多数情况下,这很好用。例如,针对以下网址运行会生成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"

但是,当数字前面没有正斜杠时,这也匹配。网址为:/service1/hel123lo/6/会导致端点字段为service1/hel

如何匹配仅以正斜杠开头的数字?

1 个答案:

答案 0 :(得分:0)

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

  

如何匹配仅以正斜杠开头的数字?

试试这个:

(?<=/)\d+

+允许多个数字。如果你真的只想要个位数,请删除它。