s %b \"%{Referer}i\" \"%{User-Agent}i\" %{JSES-6ren">
gpt4 book ai didi

python - Apache访问日志正则解析

转载 作者:行者123 更新时间:2023-12-05 08:56:27 27 4
gpt4 key购买 nike

我有一个 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 是保存此路径编码还是保留空格,但我可以生成一个 LOG 行,在 telnet 中手动发出请求)。

使用这个正则表达式:

(?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 .

最佳答案

试试这个解决方案: 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>.*)

围绕 HTTP/1.0 添加了一个捕获组,并给出了 ?量词。这也会添加到您的其他组中以防止贪婪捕获。

这就是您要实现的目标吗?

关于python - Apache访问日志正则解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40549123/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com