2016-08-11 83 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