我正在使用fluentd管道nginx日志使用尾部插件elasticsearch。提供了一个正则表达式分析字段:正则表达式来正确解析来自nginx日志的URL
^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$
我试图修改此进一步细分路径到服务和端点字段。服务只是网址的第一部分,而端点是查询参数开始或包含明确标识的所有内容。这是我想出的:
^(?<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"
然而端点,当该数目不被向前斜线这也匹配。一个URL:/service1/hel123lo/6/
将导致一个端点字段为service1/hel
我怎样才能匹配一个前面只有正斜杠的数字?
Digit后跟斜杠 - '\ d(?= /)'。 –
在你的正则表达式中有一个“服务”! –