Nivel: Intermedio+
Tema: Parsing de texto, manejo de archivos, validación robusta, agregaciones, tests con pytest
Objetivo: Leer un archivo de logs (texto), parsear líneas con formato consistente y generar métricas útiles, ignorando líneas inválidas sin romper el proceso.
Enunciado
Crea una función llamada metricas_logs(ruta_log) que:
- Reciba
ruta_log(string) a un archivo.logo.txt. - Si
ruta_logesNoneo no esstr, lanceTypeError. - Si el archivo no existe, lance
FileNotFoundError. - Lea el archivo línea por línea y procese entradas con este formato:
YYYY-MM-DD HH:MM:SS | LEVEL | mensaje
Donde:
LEVELpuede ser:INFO,WARNING,ERROR
Ejemplo de líneas válidas:
2026-01-10 09:00:00 | INFO | Inicio del servicio
2026-01-10 09:01:02 | WARNING | Respuesta lenta
2026-01-10 09:02:10 | ERROR | Fallo al conectar a la base de datos
5. Debe ignorar cualquier línea inválida (por ejemplo, formato incorrecto, campos faltantes, LEVEL desconocido).
6. Debe devolver un diccionario con esta estructura:
{
"total": int,
"por_level": {"INFO": int, "WARNING": int, "ERROR": int},
"primer_timestamp": "YYYY-MM-DD HH:MM:SS" | None,
"ultimo_timestamp": "YYYY-MM-DD HH:MM:SS" | None,
}
Notas:
totalcuenta solo líneas válidas.primer_timestampyultimo_timestampse calculan sobre líneas válidas.- Si no hay líneas válidas, ambos timestamps deben ser
None.
Ejemplos
Si el log contiene 2 INFO, 1 WARNING y 3 ERROR válidos:
total→ 6por_level["ERROR"]→ 3
Pistas
- Divide cada línea por
"|"y luego aplicastrip()para limpiar espacios. - Valida que existan exactamente 3 partes: timestamp, level, mensaje.
- Para validar el timestamp sin complicarte, usa
datetime.strptime. - Si falla el parseo, esa línea es inválida → se ignora.
Solución explicada (paso a paso)
- Validar tipos y existencia del archivo.
- Inicializar contadores: total y por nivel.
- Recorrer el archivo línea por línea:
- limpiar
\ny espacios - separar por
| - validar estructura y level permitido
- validar timestamp con
datetime.strptime - si todo OK: contar y actualizar primer/último timestamp
- limpiar
- Construir el diccionario final y devolverlo.
Ejecuta:
pytest -q
Variantes para subir de nivel (opcional)
- Top N mensajes de ERROR (por frecuencia)
- Métricas por hora (conteos agrupados por
YYYY-MM-DD HH) - Exportar resumen a CSV/JSON
- Soportar múltiples formatos de log (configurable)
- Streaming (procesar logs enormes sin cargar todo)
Lo que aprendiste
- Parsing robusto con validación real
- Ignorar errores sin ocultar fallos críticos (archivo inexistente)
- Agregaciones útiles para observabilidad básica
- Tests con archivos temporales
Accede al código completo y a los tests en GitHub para ejecutar y modificar la solución localmente.
Si quieres seguir en esta línea “muy real”, el próximo reto recomendado es:
Reto #22 — Resumir un CSV por grupo (group-by sin pandas) (agrupación + métricas + archivos).