Анализ логов серверов

Анализ логов серверов


#Парсим логи Apache/Nginx

import re

import pandas as pd


# Пример логов Nginx

log_line = '192.168.1.1 - - [12/Feb/2024:12:34:56 +0000] "GET /index.html HTTP/1.1" 200 1234'


# Регулярка для парсинга логов

log_pattern = re.compile(

  r'(?P<ip>\d+\.\d+\.\d+\.\d+) - - \[(?P<timestamp>.*?)\] "(?P<method>\w+) (?P<url>.*?) HTTP/.*" (?P<status>\d+) (?P<size>\d+)'

)


# Разбираем строку

match = log_pattern.match(log_line)

if match:

  print(match.groupdict()) # {'ip': '192.168.1.1', 'timestamp': '12/Feb/2024:12:34:56 +0000', 'method': 'GET', ...}


# Загружаем логи в DataFrame

def load_logs(log_file):

  logs = []

  with open(log_file, 'r') as f:

    for line in f:

      match = log_pattern.match(line)

      if match:

        logs.append(match.groupdict())

  return pd.DataFrame(logs)


df_logs = load_logs('access.log')

print(df_logs.head())


# Анализируем частоту запросов

import matplotlib.pyplot as plt


# Подсчет количества запросов с каждого IP

df_logs['count'] = df_logs.groupby('ip')['ip'].transform('count')


# Фильтруем IP с аномально высоким количеством запросов

suspicious_ips = df_logs[df_logs['count'] > 100] # Например, более 100 запросов за короткое время

print(suspicious_ips[['ip', 'count']].drop_duplicates())


# Визуализация топ-10 IP-адресов по количеству запросов

top_ips = df_logs['ip'].value_counts().head(10)

top_ips.plot(kind='bar', title="Top 10 IPs by request count")

plt.xlabel("IP-адрес")

plt.ylabel("Количество запросов")

plt.show()


# Обучаем ML-модель для поиска аномалий


from sklearn.ensemble import IsolationForest


# Преобразуем частоту запросов в числовой формат

df_logs['count'] = df_logs.groupby('ip')['ip'].transform('count')


# Обучаем модель

model = IsolationForest(contamination=0.05) # 5% данных считаем аномальными

df_logs['anomaly'] = model.fit_predict(df_logs[['count']])


# Выводим подозрительные IP

anomalous_ips = df_logs[df_logs['anomaly'] == -1]

print(anomalous_ips[['ip', 'count']].drop_duplicates())

Report Page