Skip to content

Implementar Sistema de Logging #2

@JosueIsOffline

Description

@JosueIsOffline

Descripción

Actualmente ITLA Plus no cuenta con un sistema de logging estructurado que permita depurar problemas, monitorear el comportamiento de los plugins y facilitar el desarrollo. Se requiere implementar un logger centralizado que proporcione diferentes niveles de registro y sea fácil de usar en todos los módulos.

Motivación

  • Depuración mejorada: Facilitar la identificación de errores y comportamientos inesperados
  • Desarrollo más eficiente: Permitir a los desarrolladores rastrear el flujo de ejecución
  • Diagnóstico de problemas: Ayudar a los usuarios a reportar issues con información detallada
  • Monitoreo de plugins: Visualizar el ciclo de vida y estado de cada plugin

Propuesta de Implementación

Niveles de Log

El logger debería soportar los siguientes niveles:

  • DEBUG: Información detallada para desarrollo
  • INFO: Mensajes informativos generales
  • WARN: Advertencias que no detienen la ejecución
  • ERROR: Errores que requieren atención

Estructura Sugerida

// src/modules/services/LoggerService.ts

export enum LogLevel {
  DEBUG = 0,
  INFO = 1,
  WARN = 2,
  ERROR = 3
}

export interface LogEntry {
  timestamp: Date;
  level: LogLevel;
  plugin?: string;
  message: string;
  data?: any;
}

export class Logger {
  private static instance: Logger;
  private logLevel: LogLevel = LogLevel.INFO;
  private logs: LogEntry[] = [];
  
  static getInstance(): Logger {
    if (!Logger.instance) {
      Logger.instance = new Logger();
    }
    return LoggerService.instance;
  }
  
  setLogLevel(level: LogLevel): void { }
  
  debug(message: string, data?: any, plugin?: string): void { }
  
  info(message: string, data?: any, plugin?: string): void { }
  
  warn(message: string, data?: any, plugin?: string): void { }
  
  error(message: string, error?: Error, plugin?: string): void { }
  
  getLogs(): LogEntry[] { }
  
  clearLogs(): void { }
  
  exportLogs(): string { }
}

Características Deseadas

  • Singleton pattern para acceso global
  • Configuración del nivel de log (por defecto INFO en producción, DEBUG en desarrollo)
  • Prefijos con colores en consola para cada nivel
  • Timestamp en cada entrada
  • Identificación del plugin que genera el log
  • Almacenamiento temporal de logs (últimos 100 registros)
  • Método para exportar logs (útil para reportar issues)
  • Modo silencioso para desactivar logs en producción si es necesario

Ejemplo de Uso

// En cualquier plugin
import { Logger } from '../services/Logger';

export class AutoLogin implements Plugin {
  private logger = Logger.getInstance();
  
  async init(): Promise {
    this.logger.info('Inicializando plugin AutoLogin', null, 'AutoLogin');
    
    try {
      // ... lógica del plugin
      this.logger.debug('Credenciales cargadas exitosamente', { hasCredentials: true }, 'AutoLogin');
    } catch (error) {
      this.logger.error('Error al cargar credenciales', error as Error, 'AutoLogin');
    }
  }
}

Formato de Salida en Consola

[2025-10-16 14:30:45] [INFO] [AutoLogin] Inicializando plugin AutoLogin
[2025-10-16 14:30:45] [DEBUG] [AutoLogin] Credenciales cargadas exitosamente
[2025-10-16 14:30:46] [ERROR] [PointsTracker] Error al obtener calificaciones: Network timeout

Beneficios

  • Mejor experiencia de desarrollo
  • Facilita la contribución de nuevos desarrolladores
  • Simplifica el proceso de reportar y resolver bugs
  • Permite monitorear el rendimiento de los plugins
  • Base para futuras herramientas de diagnóstico

Tareas

  • Crear Logger.ts en src/modules/services/
  • Implementar niveles de log con enum
  • Añadir formateo con colores en consola
  • Implementar almacenamiento temporal de logs
  • Crear método de exportación de logs
  • Integrar logger en PluginManager
  • Actualizar plugins existentes para usar el logger
  • Documentar el uso del logger en la guía de contribución
  • Añadir tests unitarios (opcional)

Notas Adicionales

  • El logger no debe afectar el rendimiento del script
  • Considerar añadir una opción en el menú de Tampermonkey para cambiar el nivel de log
  • Los logs nunca deben contener información sensible (contraseñas, tokens, etc.)
  • Evaluar si es necesario persistir logs en localStorage o mantenerlos solo en memoria

Referencias


Prioridad: Media
Tipo: Enhancement
Módulo: Core Services

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions