【发布时间】:2021-05-11 11:45:50
【问题描述】:
下午好,在测试解析access.log的代码时,出现如下错误:
Traceback(最近一次调用最后一次): 文件“logsscript_3.py”,第 31 行,在 dict_ip[ip][status_code] += 1 NameError: name 'status_code' 未定义
我需要将代码为 400 的前 10 个请求输出到 json 文件
代码是这样的:
import argparse
import json
import re
from collections import defaultdict
parser = argparse.ArgumentParser(description='log parser')
parser.add_argument('-f', dest='logfile', action='store', default='access.log')
args = parser.parse_args()
regul_ip = (r"^(?P<ips>.*?)")
regul_statuscode = (r"\s(?P<status_code>400)\s")
dict_ip = defaultdict(lambda: {"400": 0})
with open(args.logfile) as file:
for index, line in enumerate(file.readlines()):
try:
ip = re.search(regul_ip, line).group()
status_code = re.search(regul_statuscode, line).groups()[0]
except AttributeError:
pass
dict_ip[ip][status_code] += 1
print(json.dumps(dict_ip, indent=4))
with open("final_log.json", "w") as jsonfile:
json.dump(dict_ip, jsonfile, indent=5)
access.log 中的一行示例:
213.137.244.2 - - [13/Dec/2015:17:30:13 +0100] "GET /administrator/ HTTP/1.1" 200 4263 "-" "Mozilla/5.0 (Windows NT 6.0; rv:34.0)壁虎/20100101 火狐/34.0" 7717
【问题讨论】:
-
你为什么忽略
AttributeError? -
扩展@khelwood 点:示例行(可能在您的日志中还有更多)不是 400 代码行。您的正则表达式包含 400,因此它将不匹配,并且整个
status_code = ...行将失败,所有非 400 行的AttributeError: 'NoneType' object has no attribute 'groups'。忽略异常会导致dict_ip[ip]...行 b/c 中的NameErrorstatus_code未分配值。 -
好吧,我该如何修复代码?
标签: json python-3.x parsing