Pandas + Mito nginx accesslog
Продолжаю эксперементы с Pandas и Mito. В этот раз решил проанализировать nginx accesslog.
Размер моего анализируемого лога составил 150 мб.
Работаю на Macbook Air M1 16 GB Ram, процесс парсинга accesslog и создание дата-фрейма у меня занял порядка 11 секунд.
Итак, для того, чтобы распарсить nginx accesslog нужно использовать следующую команду (источник):
df = pd.read_csv('access.log', sep=r'\s(?=(?:[^"]*"[^"]*")*[^"]*$)(?![^\[]*\])', engine='python', usecols=[0, 3, 4, 5, 6, 7, 8], names=['ip', 'time', 'request', 'status', 'size', 'referer', 'user_agent'], na_values='-', header=None)
Результат у меня получился во такой:
Сразу пришла мысль — сколько запросов было в час и минуту.
Для этих целей необходимо было преобразовать колонку time в нужный форма. Для себя я определил что мне нужны отдельные колонки: с годом, месяцем, днем, часом, минутой. Для преобразовать использовал следующий код:
убрал лишние символы из даты:
df['time'] = df['time'].str.replace('+','') df['time'] = df['time'].str.replace('[','') df['time'] = df['time'].str.replace('0300]','') df['time'] = df['time'].str.replace('/2022:','-2022 ') df['time'] = df['time'].str.replace('/','-')
добавил отдельные колонки для каждого из показателей:
df['time_year'] = pd.to_datetime(df['time']).dt.year df['time_month'] = pd.to_datetime(df['time']).dt.month df['time_day'] = pd.to_datetime(df['time']).dt.day df['time_hour'] = pd.to_datetime(df['time']).dt.hour df['time_minute'] = pd.to_datetime(df['time']).dt.minute df['time_second'] = pd.to_datetime(df['time']).dt.second
На выходе получил вот такой датафрейм:
Далее, чтобы не писать много строк кода воспользовался Mito для постоения мини-отчета:
Далее, мне нужно было посмотреть какие IP есть в логе и сколько запросов они делают: