Как подсчитать количество запросов для каждого метода

#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")