Actividad Análisis con regex
Asignatura Ciencia de datos 701
Docente Andres Miranda
estudiante George Rubio
1. ARCHIVO LOG:
2. PATRONES DE REYEX:
3. Adicional:
4. Errores:
5. Solicitudes por ruta:
6. Código:
import re
import json
from collections import Counter
# Expresión regular para capturar los elementos del log
pattern = (
r'(?P<ip>\d+\.\d+\.\d+\.\d+) - - \[(?P<fecha>[^\]]+)\] '
r'"(?P<metodo>GET|POST|PUT|DELETE|HEAD|OPTIONS|CONNECT) (?P<ruta>[^ ]+) '
r'HTTP/\d\.\d" (?P<codigo>\d+) (?P<tamano>\d+|-) "(?P<referer>[^"]*)" '
r'"(?P<dispositivo>[^"]*)"'
)
# Función para extraer datos del log
def extraer_datos_log(ruta_log):
logs = []
with open(ruta_log, 'r') as f:
for line in f:
match = [Link](pattern, line)
if match:
[Link]([Link]())
return logs
# Función para guardar datos en un archivo JSON
def guardar_en_json(datos, archivo):
with open(archivo, 'w') as f:
[Link](datos, f, indent=4)
print(f"Datos guardados en '{archivo}'")
# Función para contar solicitudes por IP
def contar_solicitudes_por_ip(logs):
ip_counter = Counter(log['ip'] for log in logs)
guardar_en_json(ip_counter, '[Link]')
return ip_counter
# Función para filtrar solicitudes con errores (códigos 4xx y 5xx)
def filtrar_errores(logs):
errores = [log for log in logs if log['codigo'].startswith(('4', '5'))]
guardar_en_json(errores, '[Link]')
return errores
# Función para contar solicitudes por recurso (ruta)
def contar_solicitudes_por_ruta(logs):
ruta_counter = Counter(log['ruta'] for log in logs)
guardar_en_json(ruta_counter, '[Link]')
return ruta_counter
# Ruta del archivo de log
ruta_log = 'C:\\Users\\saram\\Downloads\\apache_logs.txt'
# Extracción y análisis de los datos del log
logs = extraer_datos_log(ruta_log)
guardar_en_json(logs, '[Link]')
# Realización de análisis
ip_counter = contar_solicitudes_por_ip(logs)
errores = filtrar_errores(logs)
ruta_counter = contar_solicitudes_por_ruta(logs)
# Imprimir resultados en consola para referencia
print("Cantidad de solicitudes por IP:")
for ip, count in ip_counter.items():
print(f"{ip}: {count}")
print("\nSolicitudes con códigos de estado 4xx y 5xx:")
for error in errores:
print(error)
print("\nCantidad de solicitudes por recurso:")
for ruta, count in ruta_counter.items():
print(f"{ruta}: {count}")