Log System
Ecosistema completo para organización y gestión de contenido con interfaces espaciales
Librería Log System (Core)
Prioridad: Muy Alta
Propósito: Sistema de logging con diferentes destinos para registrar eventos y métricas del sistema, fundamental para la observabilidad y debugging de toda la plataforma GoGrab.
Especificación funcional
Esta librería debe proporcionar:
Modelos principales:
- Enums (
LogLevel, estados de appenders) LoggerConfig(configuración principal del sistema)LogEntry(estructura de entrada de log)LogAppender(interfaz para destinos de logging)Formatter(interfaz para formateo de logs)
Servicios core:
LoggerService(servicio principal de logging)
Utilidades:
- Formatters (
JsonFormatter,TextFormatter)
Decorators:
@loggable(logging automático de métodos)@logError(captura y logging de errores)@performance(medición de rendimiento)
Integraciones previstas:
EventSystem(para eventos del sistema)- NgXS (para logging de state management)
Appenders/Destinos:
ConsoleAppender(consola del navegador)RemoteAppender(servidor remoto) - opcional
Estado actual
- Tipo: librería Nx de Angular.
- Ruta de importación:
@libs-core/log-system(configurada entsconfig.base.json). - API pública actual: solo barrel
src/index.ts. - Estado de implementación: Estructura base creada, pendiente implementación completa.
API pública actual
- Re-export desde:
libs/core/log-system/src/index.ts. - No hay componentes principales ni servicios publicados aún.
Estructura del paquete
src/lib/log-system/log-system.ts: componente placeholder interno (no parte de una API estable).src/index.ts: barrel para futuros exports públicos.
Comandos de mantenimiento
- Ejecutar pruebas:
nx test log-system - Linting:
nx lint log-system
Dependencias identificadas
Esta librería será dependencia fundamental para:
- EventSystem (
@libs-core/event-system) - Para logging de eventos del sistema - Autenticación y autorización - Para logging de sesiones y permisos
- DataAccess - Para logging de operaciones de datos
- Action Registry - Para logging de acciones del sistema
- Module Integrator - Para logging del orquestador de módulos
- UI Framework - Para logging de componentes (opcional)
Nota de implementación: Actualmente no existen servicios ni modelos implementados; al agregarlos, garantizar pruebas, tipado estricto y exportación desde src/index.ts.
Importancia en el ecosistema GoGrab
Esta librería es foundational para toda la plataforma, siendo requerida por prácticamente todos los módulos del sistema:
- Debugging y observabilidad: Base para identificar problemas en producción
- Auditoría: Registro de acciones críticas del sistema (autenticación, datos, etc.)
- Performance monitoring: Medición de rendimiento de operaciones críticas
- Multi-tenant awareness: Logging diferenciado por tenant/espacio
- Troubleshooting: Trazabilidad de requests y operaciones complejas
Sin un sistema de logging robusto, el diagnóstico y mantenimiento de la plataforma sería extremadamente complejo.
Diseño y alcance
- Principios: mínimo acoplamiento, seguro por defecto, resiliente, observable y configurable en tiempo de ejecución.
- Compatible con Angular Standalone, SSR y tree-shaking.
- Multi-tenant: todo
LogEntrydebe poder asociarse atenantIdycorrelationId. - Falla segura: errores del logger nunca deben romper el flujo de la app.
Modelo de dominio (tipos clave)
LogLevel:trace | debug | info | warn | error | critital.LogContext:{ tenantId?: string; correlationId?: string; userId?: string; source?: string; tags?: string[]; }.LogEntry<T = unknown>:{ timestamp: string; level: LogLevel; message: string; data?: T; error?: unknown; context?: LogContext; }.Formatter:{ contentType: 'text/plain' | 'application/json'; format(entry: LogEntry): string | Record<string, unknown>; }.LogAppender:{ name: string; append(entry: LogEntry): Promise<void> | void; flush?(): Promise<void>; healthy?(): Promise<boolean>; }.LoggerConfig:level: LogLevelappenders: LogAppender[]formatter?: FormatterdefaultContext?: Partial<LogContext>enablePerformance?: booleanredact?: { keys?: string[]; patterns?: RegExp[] }sampling?: { rate: number /* 0..1 */; levels?: LogLevel[] }queue?: { maxSize: number; flushIntervalMs: number; }
Servicios y API
LoggerService(principal): métodostrace|debug|info|warn|error|critical(message, data?, context?).child(context: Partial<LogContext>)para enriquecer contexto.setLevel(level: LogLevel)para ajustar nivel en caliente.flush()para vaciar buffers (ej. antes deunload).
provideLogSystem(config: LoggerConfig | () => LoggerConfig): proveedor Angular para root.LOG_CONTEXTyTENANT_IDcomoInjectionTokenopcionales para multi-tenant.
Appenders previstos
ConsoleAppender(MVP): mapea niveles aconsole.debug/info/warn/error; seguro para SSR.RemoteAppender(Fase 2):- Config:
endpoint,method,headers,timeoutMs,batch?: { size: number; intervalMs: number },auth?: () => string | Promise<string>. - Resiliencia: reintentos con backoff exponencial, circuito abierto, cola con tope y política de descarte FIFO.
- Config:
Formatters
JsonFormatter(default): objeto normalizado; aplicaredacta claves sensibles y patrones.TextFormatter:"[ts][lvl][tenant][corr] message | key=value ..."para legibilidad local.
Decorators
@loggable(level = 'debug'): log de entrada/salida del método y duración; oculta valores marcados como sensibles.@logError(level = 'error'): captura errores, registraerrory vuelve a lanzar (no silencia excepciones).@performance({ level = 'info', thresholdMs = 200 }): registra duración si excede umbral.
Integraciones
- Con
event-system: publicarSystemEventopcional al registrarerror|criticalpara orquestación/reintentos. - Con NxGS (opcional):
- Meta-reducer para log de acciones y tiempos de reducción.
- Decorador para acciones
@Actioncon@performance.
Configuración e inicialización (Angular)
Esta librería es 100% standalone: no expone NgModule y no usa forRoot. La configuración se realiza mediante providers en bootstrapApplication, ApplicationConfig, rutas o componentes standalone.
import { provideLogSystem } from '@libs-core/log-system';
bootstrapApplication(AppComponent, {
providers: [
provideLogSystem({
level: 'info',
appenders: [new ConsoleAppender()],
formatter: new JsonFormatter(),
defaultContext: { source: 'gograb-space' },
queue: { maxSize: 1000, flushIntervalMs: 2000 },
redact: { keys: ['password', 'token'] },
}),
],
});
Alternativa con ApplicationConfig (p. ej. en app.config.ts):
import { ApplicationConfig } from '@angular/core';
import { provideLogSystem } from '@libs-core/log-system';
export const appConfig: ApplicationConfig = {
providers: [
provideLogSystem(() => ({
level: 'info',
appenders: [new ConsoleAppender()],
})),
],
};
Proveer a nivel de ruta (feature aislada):
export const routes: Routes = [
{
path: 'admin',
loadComponent: () => import('./admin.component').then((m) => m.AdminComponent),
providers: [provideLogSystem(() => ({ level: 'warn', appenders: [new ConsoleAppender()] }))],
},
];
Ajuste de contexto por componente standalone (sin redefinir el logger):
import { Component } from '@angular/core';
import { LOG_CONTEXT } from '@libs-core/log-system';
@Component({
standalone: true,
selector: 'feature-x',
template: '...',
providers: [{ provide: LOG_CONTEXT, useValue: { source: 'feature-x' } }],
})
export class FeatureXComponent {}
Uso en código:
constructor(private logger: LoggerService) {}
save(item: Item) {
this.logger.info('Guardando item', { id: item.id });
}
Decorators:
class PaymentService {
@performance({ thresholdMs: 300 })
@logError()
async charge(payload: ChargeRequest) {
// ...
}
}
Notas standalone:
- Si se utiliza
RemoteAppender, agregarprovideHttpClient()en losprovidersde donde se configure el logger. - Se recomienda configurar el logger una sola vez a nivel root y usar
LOG_CONTEXTologger.child()para ajustar contexto por feature.
Multi-tenant y trazabilidad
tenantIdse resuelve víaInjectionTokenoconfig.defaultContexty se propaga en cadaLogEntry.correlationIdpor request (SSR) o por navegación; proveer util para generarlo y heredarlo.RemoteAppenderdebe enviartenantId/correlationIden headers (X-Tenant-Id,X-Correlation-Id).
Seguridad y cumplimiento
- Redacción de PII/secrets basada en claves (
password,token,authorization) y patrones (e.g., tarjetas, emails). - No persistir localmente por defecto. Si se habilita almacenamiento, cifrar y expirar.
- Sanitizar
Error(stack opcional por entorno, p.ej. no en producción si es sensible).
Rendimiento y resiliencia
- Cola asíncrona no bloqueante con tamaño máximo; descartar silenciosamente con contador de
dropped. - Backoff exponencial y circuito abierto para
RemoteAppender. - Muestreo (
sampling) para niveles verbosos en producción. flush()enbeforeunloady al cerrar SSR.
Manejo de errores
- Fallo de un appender no debe impedir que otros procesen el evento.
- Registrar internamente métricas del logger (errores de appender, reintentos, descartes).
- En caso de error grave en todos los appenders, degradar a
console.warncon mensaje mínimo.
Testing y calidad
- Unit tests: niveles, redacción, formateadores, colas,
ConsoleAppendery decoradores. - Contract tests para
LogAppenderyFormatter(fixtures comunes). - E2E (opcional): verificación de envío remoto con
RemoteAppendermock. - Métricas de cobertura mínimas: 90% líneas/ramas en el paquete.
API pública prevista (exportar desde src/index.ts)
- Tipos:
LogLevel,LogEntry,LogContext,LoggerConfig. - Servicios:
LoggerService,provideLogSystem. - Utilidades:
JsonFormatter,TextFormatter. - Appenders:
ConsoleAppender(+RemoteAppendercuando esté listo). - Decorators:
loggable,logError,performance.
Estructura propuesta
libs/core/log-system/src/
index.ts
lib/
config/
logger-config.ts
models/
log-entry.ts
log-level.ts
log-context.ts
appender.ts
formatter.ts
services/
logger.service.ts
provider.ts
appenders/
console-appender.ts
remote-appender.ts
formatters/
json-formatter.ts
text-formatter.ts
decorators/
loggable.ts
log-error.ts
performance.ts
Roadmap de implementación
Fase 1 - MVP Crítico (Prioridad: Muy Alta)
Objetivo: Funcionalidad básica requerida por otros módulos core
- ✅ Modelos base (
LogLevel,LogEntry,LogContext,LoggerConfig) - ✅
LoggerServicecon métodos básicos (trace|debug|info|warn|error|critical) - ✅
ConsoleAppender(seguro para SSR) - ✅
JsonFormattercon redacción básica - ✅ Decoradores
@loggable,@logError,@performance - ✅ Sistema de proveedores
provideLogSystem - ✅ Cola asíncrona básica y manejo de errores
Fase 2 - Funcionalidad avanzada
Objetivo: Preparación para producción
RemoteAppendercon batch/retry/circuit breakerTextFormatterpara debugging local- Sampling avanzado y métricas internas
- Integración básica con
EventSystem
Fase 3 - Integraciones y observabilidad
Objetivo: Ecosistema completo
- Integración completa con NgXS (meta-reducers)
- Herramientas de observabilidad y dashboards
- Métricas de health y performance del propio logger
Próximos pasos críticos
Implementación inmediata requerida
- Completar Fase 1 - Sin esta librería, otros módulos core no pueden avanzar
- Coordinación con EventSystem - Ambos se necesitan mutuamente, implementar en paralelo
- Testing exhaustivo - Al ser dependencia de tantos módulos, la estabilidad es crítica
Dependencias bloqueantes
- EventSystem: Necesario para la integración de eventos de logging
- Utilities: Para funciones auxiliares (DateUtils, StringUtils, etc.)
Módulos bloqueados sin esta librería
- Autenticación y autorización (logging de sesiones crítico)
- DataAccess (logging de operaciones de datos)
- Module Integrator (logging del orquestador)
- Action Registry (logging de acciones)
Estado recomendado: Implementar inmediatamente después de Utilities y en paralelo con EventSystem.