我正在使用流畅的方法使用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
如何匹配仅以正斜杠开头的数字?
答案 0 :(得分:0)
忽略你问题中除最后一句之外的所有内容,这似乎是唯一明确的问题:
如何匹配仅以正斜杠开头的数字?
试试这个:
(?<=/)\d+
+
允许多个数字。如果你真的只想要个位数,请删除它。