【发布时间】: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!