Python中re.match().groups()解析Apache日志匹配失败的问题求助
问题分析与解决
错误根源
- 正则匹配位置完全错误:你想要过滤的是referer字段(日志中倒数第三个带引号的内容),但却错误地修改了请求行的匹配规则(日志中第一个带引号的内容,格式是
GET /xxx HTTP/1.1)。请求行根本不会以http://开头,导致正则完全匹配失败,re.match()返回None。 - 未处理匹配失败的情况:当
re.match()找不到匹配时会返回None,直接调用groups()必然触发AttributeError,因为None没有这个方法。
解决方法
步骤1:修正正则规则
将过滤规则放到referer对应的匹配组中,也就是把原本匹配referer的([^\"]+)替换为(http://[a-zA-Z].*),确保只匹配以http://+字母开头的referer。
步骤2:添加匹配结果判断
在调用groups()前,先检查matched_line是否为None,避免报错。
修正后的代码示例
import re # 修正后的正则:仅匹配符合要求的referer CUSTOM_LOG_PATTERN = '- - \[.*?\] "(.*)" (\d{3}) (.*) "(http://[a-zA-Z].*)" "(.*?)" (.*)' # 符合要求的日志行 valid_log = '- - [01/Feb/2017:00:00:00 +0200] "GET /aikakausi/binding/1145113/image/14 HTTP/1.1" 200 658925 "http://digi.kansalliskirjasto.fi/aikakausi/binding/1145113?page=14&term=HOIKKA" "Mozilla/5.0 (Linux; Android 5.1.1; SM-J320FN Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/49.0.2623.105 Mobile Safari/537.36 [FB_IAB/MESSENGER;FBAV/100.0.0.29.61;]" 569' # 不符合要求的日志行(referer为IP开头) invalid_log = '- - [01/Feb/2017:12:34:51 +0200] "GET /aikakausi/binding/499213?page=55 HTTP/1.1" 401 1612 "http://192.168.8.1/html/home.html?url&address=http://digi.kansalliskirjasto.fi/aikakausi/binding/499213?page=55" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36" 1995' cleaned_lines = [] # 处理符合要求的日志 matched_line = re.match(CUSTOM_LOG_PATTERN, valid_log) if matched_line: l = matched_line.groups() cleaned_lines.append({ "client_request_line": l[0], "status": l[1], "bytes_sent": l[2], "referer": l[3], "user_agent": l[4], "session_id": l[5], }) print("处理成功的日志:", cleaned_lines) else: print("当前日志不符合规则,跳过") # 处理不符合要求的日志 matched_line = re.match(CUSTOM_LOG_PATTERN, invalid_log) if matched_line: print(matched_line.groups()) else: print("当前日志的referer不符合规则,跳过")
可选优化:兼容不符合规则的日志
如果希望保留其他字段,仅过滤异常referer,可以将referer的匹配组改为可选:
# 允许referer为空或不符合规则,匹配后再判断 CUSTOM_LOG_PATTERN = '- - \[.*?\] "(.*)" (\d{3}) (.*) "(http://[a-zA-Z].*)?" "(.*?)" (.*)'
内容的提问来源于stack exchange,提问作者farid
相关产品推荐
相关产品推荐

