Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- import unittest
- import re
- from datetime import datetime
- import collections
- import sys
- splitter = re.compile(r"(\S+) \S+ \S+ \[([^:]+):(\d+:\d+:\d+) ([^]]+)] "
- r"\S+ (\S+) \S+ \S+ \S+ \"([^\"]+)\" "
- r"\"([^\"]+)\"\s*(\d*)")
- class Stat:
- def __init__(self):
- self.fastest_page = ('', 99999999)
- self.slowest_page = ('', -1)
- self.avg_page_speed_stat = collections.Counter()
- self.date_client_stat = {}
- self.browser_stat = collections.Counter()
- self.page_stat = collections.Counter()
- self.general_client_stat = collections.Counter()
- def add_line(self, line):
- splitted_line = re.split(splitter, line)
- if len(splitted_line) < 8:
- return
- page = splitted_line[5]
- date = splitted_line[2]
- client = splitted_line[1]
- browser = splitted_line[7]
- if all((page, client, browser)):
- self.page_stat[page] += 1
- self.browser_stat[browser] += 1
- if date not in self.date_client_stat:
- self.date_client_stat[date] = collections.Counter()
- self.date_client_stat[date][client] += 1
- time = splitted_line[8]
- if time:
- time = int(time)
- if time <= self.fastest_page[1]:
- self.fastest_page = (page, time)
- if time >= self.slowest_page[1]:
- self.slowest_page = (page, time)
- if page not in self.avg_page_speed_stat:
- self.avg_page_speed_stat[page] = (time, 1)
- else:
- count = self.avg_page_speed_stat[page][1]
- self.avg_page_speed_stat[page] = (
- (self.avg_page_speed_stat[page][0] * count + time)
- / (count + 1), count + 1)
- def create_client_stat(self):
- date_stat_client = {}
- for key in self.date_client_stat.keys():
- self.general_client_stat += self.date_client_stat[key]
- new_key = datetime.strptime(key, '%d/%b/%Y').date()
- date_stat_client[new_key] = self.date_client_stat[key].most_common(1)[0][0]
- self.date_client_stat = date_stat_client
- def results(self):
- self.create_client_stat()
- result = {
- 'FastestPage': self.fastest_page[0],
- 'MostActiveClient': self.general_client_stat.most_common(1)[0][0],
- 'MostActiveClientByDay': self.date_client_stat,
- 'MostPopularBrowser': self.browser_stat.most_common(1)[0][0],
- 'MostPopularPage': self.page_stat.most_common(1)[0][0],
- 'SlowestAveragePage': self.avg_page_speed_stat.most_common(1)[0][0],
- 'SlowestPage': self.slowest_page[0]
- }
- return result
- def make_stat():
- return Stat()
- #class LogStatTests(unittest.TestCase):
- # TODO: add unit tests
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement