#json #python-3.x #parsing
Вопрос:
Мне нужно подсчитать количество запросов для каждого из методов — GET, POST, PUT, DELETE, HEAD из Apache access.log. Пример записи из access.log:
83.167.113.100 - - [12/Dec/2015:18:31:25 0100] "POST /administrator/index.php HTTP/1.1" 200 4494 "http://almhuette-raith.at/administrator/" "Mozilla/5.0 (Windows NT 6.0; rv:34.0) Gecko/20100101 Firefox/34.0" 8566
И вот код:
regul_ip = (r"^(?P<ips>.*?)")
regul_method = (r""(?P<request_method>GET|POST|PUT|DELETE|HEAD)")
dict_m = defaultdict(lambda: {"GET": 0, "POST": 0, "PUT": 0, "DELETE": 0, "HEAD": 0})
with open(args.logfile) as file:
for index, line in enumerate(file.readlines()):
try:
ip = re.search(reg_ip, line).group()
method = re.search(reg_meth, line).groups()[0]
except AttributeError:
pass
dict_m[ip][method] = 1
print(json.dumps(dict_m, indent=4))
Результат таков:
},
"107.173.213.131": {
"GET": 1,
"POST": 0,
"PUT": 0,
"DELETE": 0,
"HEAD": 0
},
"5.152.203.98": {
"GET": 1,
"POST": 0,
"PUT": 0,
"DELETE": 0,
"POST": 3,
"PUT": 0,
"DELETE": 0,
"HEAD": 0
},
"5.141.199.97": {
"GET": 9,
"POST": 9,
"PUT": 0,
"DELETE":
Но мне нужно следующее:
{
"GET": 2248007,
"POST": 918924,
"PUT": 75,
"DELETE": 1,
"HEAD": 49973
}
Как я могу исправить код?
Комментарии:
1. Разве вы не можете просто посчитать количество повторений каждого из этих слов?
Ответ №1:
Основываясь на файле журнала, каждый запрос будет содержать ключевое слово (ОПУБЛИКОВАТЬ, ПОЛУЧИТЬ, УДАЛИТЬ, ПОМЕСТИТЬ) один раз. Таким образом, вы можете просто подсчитать вхождения каждого ключевого слова.
dict_m = dict()
with open(args.logfile) as file:
data = file.read()
dict_m["GET"] = data.count("GET")
dict_m["POST"] = data.count("POST")
dict_m["DELETE"] = data.count("DELETE")
dict_m["PUT"] = data.count("PUT")