我正在使用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(?= /)'。 –
在你的正則表達式中有一個「服務」! –