2015-11-12 103 views
0

我已更改我的nginx日誌以顯示自定義日誌而不是默認日誌。我添加了兩個字段$ request_time和$ upstream_response_time。我使用PHP來解析這個。解析組合日誌格式問題日誌

我不是偉大的正則表達式,但我試圖修改另一個正則表達式我拿起從Parse Apache log in PHP using preg_match

正則表達式有:

$regex = '/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) "([^"]*)" "([^"]*)"$/'; 

我不是偉大的正則表達式,所以這是我想要做的,而不是:

$pattern = '/^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) "([^"]*)" "([^"]*)"$ ^(\S+) ^(\S+) /'; 

凡我輸入看起來是這樣的:

$line = "127.0.0.1 - - [12/Nov/2015:13:39:19 -0500] \"GET /mj/feed/ HTTP/1.1\" 200 3276 \"-\" \"rogerbot/1.0 (http://www.moz.com/dp/rogerbot, [email protected])\" 0.254 0.254"; 

以上兩個額外的字段是0.2540.254

所以我試圖獲得[14] = 0.254[15] = 0.254

我試圖通過實時在線正則表達式工具玩沒有任何運氣的正則表達式。

任何幫助,將不勝感激。

回答

1

^是一個字符串(或行,如果正在使用m修飾符)的開始。在角色類中它會否定內部角色。所以

^(\S+) ^(\S+) 

在您的正則表達式中不起作用。

試試這個:

^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) "([^"]*)" "([^"]*)" (\S+) (\S+)$ 

Regex101演示:https://regex101.com/r/lQ6zX9/1

或使用否定的字符類寫作的另一種方式:

^(\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) "([^"]*)" "([^"]*)" ([^\s]+) ([^\s]+)$ 
+0

感謝克里斯。我想我是無情地複製/粘貼。 – hadis