Analizador interactivo de logs de sistema para Linux.
Detecta, clasifica y resume los logs de los servicios más comunes, con diagnósticos automáticos sobre retención, rotación y uso de disco.
- Análisis automático: Detecta logs activos, rotados y comprimidos
- Diagnósticos inteligentes: Alertas sobre retención, rotación y uso de disco
- Interfaz interactiva: Selector visual de servicios con confirmación de rutas
- Soporte multi-servicio: Squid, Nginx, Pi-hole, AdGuard Home y servicios personalizados
- Configuración flexible: Añade tus propios servicios fácilmente
- Salida formateada: Informes claros con Rich para mejor legibilidad
- Python 3.7+
- Linux (diseñado para sistemas con
/var/log) - Permisos de root (sudo) para leer logs del sistema
pip install -r requirements.txtLas dependencias principales son:
rich>=13.0.0- Para formateo visual y tablasquestionary>=2.0.0- Para interfaz interactiva (opcional, sin él usa modo básico)
# Clonar el repositorio
git clone https://github.com/tu-usuario/logscope
cd logscope
# Instalar dependencias
pip install -r requirements.txtsudo python main.pyNota: Se recomienda
sudoporque la mayoría de logs en/var/logrequieren permisos de root.
- Seleccionar servicio: Elige entre los servicios predefinidos o añade uno personalizado
- Confirmar ruta: Verifica o cambia la ruta de los logs detectada automáticamente
- Configurar prefijo: Especifica el prefijo de archivos de logs (si aplica)
- Ver resultados: Analiza la información de retención, rotación y uso de disco
Si no tienes questionary instalado, logscope funcionará en modo básico con selección por números.
La configuración de servicios se almacena en services.json. Puedes editarlo manualmente o usar el asistente interactivo.
{
"id": "squid",
"label": "Squid Proxy",
"paths": ["/var/log/squid", "/var/log/squid3"],
"log_prefix": "",
"log_patterns": ["access.log", "cache.log"]
}Campos:
id: Identificador único del servicio (sin espacios)label: Nombre visible en el selectorpaths: Lista de rutas donde buscar logslog_prefix: Prefijo de archivos de logs (ej: "adguarddns" para "adguarddns*.log")log_patterns: Patrones adicionales de archivos a buscar
- Ejecuta
sudo python main.py - Selecciona "➕ Agregar servicio"
- Sigue las preguntas del asistente:
- ID interno (ej: haproxy)
- Nombre visible (ej: HAProxy)
- Rutas de logs separadas por coma
- Prefijo de archivos (opcional)
- Patrones de archivo separados por coma (opcional)
Edita services.json y añade tu servicio:
{
"id": "haproxy",
"label": "HAProxy",
"paths": ["/var/log/haproxy"],
"log_prefix": "haproxy-",
"log_patterns": ["access.log", "error.log"]
}Los colores de la interfaz se configuran en config.py bajo la variable THEME. Puedes personalizar los colores para:
- Títulos
- Mensajes de éxito, advertencia y error
- Información destacada y silenciada
| Servicio | Rutas por defecto |
|---|---|
| Squid Proxy | /var/log/squid, /var/log/squid3 |
| Nginx | /var/log/nginx |
| Pi-hole | /var/log/pihole, /var/log/pihole.log |
| AdGuard Home | /opt/AdGuardHome/work |
| Ruta custom | La que tú indiques |
╭─────────────────────────────────╮
│ logscope v1.0.0 │
│ Analizador de logs de sistema │
╰─────────────────────────────────╯
╭─────────────────────────────────────────────╮
│ Squid Proxy ✓ Encontrado │
│ /var/log/squid │
╰─────────────────────────────────────────────╯
┌────────────────────────┬────────────────────┐
│ Primer log │ 2025-02-06 │
│ Último log │ 2026-05-02 │
│ Cobertura │ 451 días (~1 año) │
└────────────────────────┴────────────────────┘
┌────────────────────────┬───────┐
│ Logs activos │ 3 │
│ Logs rotados │ 450 │
│ Comprimidos │ 445 │
│ Sin comprimir │ 5 │
│ Total archivos │ 453 │
└────────────────────────┴───────┘
┌────────────────────────┬──────────┐
│ Tamaño total │ 8.3 GB │
│ Promedio diario │ 18.9 MB │
│ Rotados sin comprimir │ 245.0 MB │
└────────────────────────┴──────────┘
✓ Retención anual detectada (451 días)
⚠ Rotación dual detectada — mezcla de rotación por número y por fecha
| Diagnóstico | Cuándo se activa |
|---|---|
| ✓ Retención anual | Cobertura ≥ 360 días |
| ⚠ Retención corta | Cobertura < 60 días |
| ⚠ Rotación dual | Mezcla de .1/.2 y -YYYYMMDD.gz en el mismo dir |
| ⚠ Sin rotación detectada | Solo archivos activos, sin ningún rotado |
| ⚠ Logs sin comprimir acumulados | Más de 5 rotados sin comprimir |
| ℹ Squid: access.log grande | Log activo supera 500 MB |
| ℹ Nginx: multi-virtualhost | Múltiples access.log detectados |
logscope/
├── main.py ← Punto de entrada, CLI interactivo
├── config.py ← Configuración central
├── requirements.txt
├── core/
│ ├── scanner.py ← Motor de escaneo de filesystem
│ ├── parser.py ← Clase base ServiceAnalyzer
│ ├── formatter.py ← Presentación visual (Rich)
│ └── utils.py ← Utilidades compartidas
└── services/
├── squid.py
├── nginx.py
├── pihole.py
├── adguard.py
└── custom.py
- Crea
services/miservicio.pyheredando deServiceAnalyzer:
from core.parser import ServiceAnalyzer
class MiServicioAnalyzer(ServiceAnalyzer):
name = "miservicio"
label = "Mi Servicio"
default_paths = ["/var/log/miservicio"]
log_patterns = ["access.log", "error.log"]- Regístralo en
services/__init__.py:
from services.miservicio import MiServicioAnalyzer
SERVICE_MAP["miservicio"] = MiServicioAnalyzer- Añade la entrada en
config.py → SERVICES.
-
--export report.json— exportar análisis -
--all— escanear todos los servicios de una vez - Comparativa de retención entre servicios
- Soporte journalctl para servicios sin logs en disco
- Apache HTTP Server, HAProxy, Postfix
¡Las contribuciones son bienvenidas! Si quieres mejorar logscope, sigue estos pasos:
Si encuentras un bug o tienes una sugerencia:
- Abre un issue en GitHub describiendo el problema
- Incluye información de tu sistema (distribución, versión de Python)
- Proporciona pasos para reproducir el error (si es un bug)
- Haz un fork del repositorio
- Crea una rama para tu feature (
git checkout -b mi-feature) - Haz tus cambios siguiendo el estilo del código existente
- Asegúrate de que el código funcione correctamente
- Haz commit de tus cambios (
git commit -m 'Añadir mi feature') - Push a la rama (
git push origin mi-feature) - Abre un Pull Request
Si quieres añadir soporte para un servicio no incluido:
- Añade el servicio a services.json (ver sección de configuración)
- Prueba el servicio ejecutando logscope y verificando que detecta los logs correctamente
- Documenta el cambio actualizando este README con el nuevo servicio en la tabla de servicios soportados
- Envía un Pull Request con tus cambios
- Sigue el estilo PEP 8 para Python
- Añade comentarios para código complejo
- Mantén las funciones pequeñas y enfocadas
- Prueba tus cambios antes de enviar un PR
Causa: El servicio no tiene logs en las rutas por defecto configuradas.
Solución:
- Usa la opción "Introducir otra ruta" para especificar la ruta correcta
- Verifica que los logs existen en el sistema
- Añade el servicio personalizado con la ruta correcta en
services.json
Causa: No tienes permisos de root para leer los logs.
Solución:
- Ejecuta logscope con
sudo python main.py - O ajusta los permisos de los directorios de logs (no recomendado por seguridad)
Causa: questionary no está instalado o hay problemas con la terminal.
Solución:
- Logscope automáticamente cambiará a modo básico sin questionary
- Para reinstalar:
pip install --upgrade questionary - Si persiste, usa el modo básico que es completamente funcional
Causa: Los patrones de rotación o prefijos no coinciden con tu configuración.
Solución:
- Usa la opción de personalizar el prefijo durante el análisis
- Edita
services.jsonpara ajustar los patrones de tu servicio - Verifica que los nombres de archivos coinciden con los patrones configurados
Causa: Los archivos comprimidos tienen un formato diferente al esperado (.gz, .bz2, etc.).
Solución:
- Actualiza el código en
core/scanner.pypara soportar el formato de compresión - O descomprime los logs manualmente antes del análisis