2016-11-11 124 views
0

我有Apache的自定義訪問日誌:Apache的訪問日誌的正則表達式解析

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{JSESSIONID}C %D %V" mylog 

我試圖從Python的日誌生成的解析;但我有兩個問題:

  • 沒有請求方法(HTTP/1.0或HTTP/1.1)的請求沒有正確解析。
  • 對請求路徑中的空格請求沒有正確解析(我不知道Apache是​​否保存了此路徑編碼或保留空格,但我可以在telnet中手動生成一條LOG線)。

使用這個表達式:

(?P<ip>.*) (?P<remote_log_name>.*) (?P<userid>.*) \[(?P<date>.*)(?=) (?P<timezone>.*?)\] \"(?P<request_method>.*) (?P<path>.*)(?P<request_version> HTTP/.*)\" (?P<status>.*) (?P<length>.*) \"(?P<referrer>.*)\" \"(?P<user_agent>.*)\" (?P<session_id>.*) (?P<generation_time_micro>.*) (?P<virtual_host>.*) 

解析失敗,第3行此日誌中:

1.1.1.2 - - [11/Nov/2016:03:04:55 +0100] "GET /" 200 83 "-" "-" - 9221 1.1.1.1 
127.0.0.1 - - [11/Nov/2016:14:24:21 +0100] "GET /uno dos" 404 298 "-" "-" - 400233 1.1.1.1 
127.0.0.1 - - [11/Nov/2016:14:23:37 +0100] "GET /uno dos HTTP/1.0" 404 298 "-" "-" - 385111 1.1.1.1 
1.1.1.1 - - [11/Nov/2016:00:00:11 +0100] "GET /icc HTTP/1.1" 302 - "-" "XXX XXX XXX" - 6160 11.1.1.1 
1.1.1.1 - - [11/Nov/2016:00:00:11 +0100] "GET /icc/ HTTP/1.1" 302 - "-" "XXX XXX XXX" - 2981 1.1.1.1 

正則表達式可以在這裏https://regex101.com/r/xDfSqj/2模擬。

+0

你能幫我理解日期匹配後爲什麼使用前瞻'''(?=)'''?刪除這似乎並沒有改變正則表達式模擬器的結果,並根據apache文檔,該空間始終存在。 – liquidki

回答

2

嘗試這種解決方案: https://regex101.com/r/xDfSqj/4

是你有,但同樣的事情:

(?P<ip>.*?) (?P<remote_log_name>.*?) (?P<userid>.*?) \[(?P<date>.*?)(?=) (?P<timezone>.*?)\] \"(?P<request_method>.*?) (?P<path>.*?)(?P<request_version> HTTP/.*)?\" (?P<status>.*?) (?P<length>.*?) \"(?P<referrer>.*?)\" \"(?P<user_agent>.*?)\" (?P<session_id>.*?) (?P<generation_time_micro>.*?) (?P<virtual_host>.*) 

A捕獲組已被添加各地的HTTP/1.0和給出的?量詞。這也被添加到您的其他組,以防止貪婪捕獲。

這是你想要實現的嗎?