2016-08-11 78 views
0

我正在使用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

我怎样才能匹配一个前面只有正斜杠的数字?

+0

Digit后跟斜杠 - '\ d(?= /)'。 –

+0

在你的正则表达式中有一个“服务”! –

回答

0

忽略你的问题一切,除了最后一句,这似乎是唯一清楚的问题:

我怎么能上只接一个斜线一个数字匹配吗?

试试这个:

(?<=/)\d+ 

+允许一个以上的数字。如果你真的只想要单个数字,请将其删除。

+0

问题的其余部分至关重要,因为它解释了我通过命名捕获将URL分割成各个部分的方法。我需要捕获整个网址直到查询参数的开头或前面加正斜杠的数字 – waynemetcalfe