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模拟。
你能帮我理解日期匹配后为什么使用前瞻'''(?=)'''?删除这似乎并没有改变正则表达式模拟器的结果,并根据apache文档,该空间始终存在。 – liquidki