Ir al contenido

Módulo Logger

El Módulo Logger (@zumito-team/logger-module) proporciona un sistema de logging centralizado. Puede enviar logs a canales de Discord configurados (como embeds) y persistirlos en la base de datos para consultas posteriores.

Ventana de terminal
npm install @zumito-team/logger-module

Agrega a tu zumito.config.ts:

bundles: ['@zumito-team/logger-module']

El servicio principal accesible a través del contenedor de servicios:

import { ServiceContainer } from 'zumito-framework';
const logger = ServiceContainer.getService('LogManager');
MétodoFirmaDescripción
log(data)(data: LogData): Promise<void>Registra un evento. Envía a canal Discord (si está configurado) y persiste en base de datos.
logToChannel(channel, log)(channel, log: LogData): Promise<void>Envía un embed de Discord al canal especificado con el título y descripción del log.

El método log() acepta una unión discriminada de datos de log según el contexto:

// Log a nivel bot
await logger.log({
context: 'bot',
title: 'Bot iniciado',
description: 'El bot se ha conectado exitosamente a Discord.'
});
// Log a nivel guild
await logger.log({
context: 'guild',
guildId: '123456789',
channelId: '987654321',
title: 'Miembro unido',
description: 'El usuario @ejemplo se unió al servidor.'
});
// Log de DM
await logger.log({
context: 'dm',
channelId: '987654321',
title: 'DM recibido',
description: 'Se recibió un DM del usuario @ejemplo.'
});
// Log genérico
await logger.log({
context: 'other',
title: 'Evento personalizado',
description: 'Ocurrió algo que no encaja en otros contextos.'
});
CampoTipoDescripción
context'bot' | 'guild' | 'dm' | 'other'Categoría de contexto.
titlestringTítulo corto del log.
descriptionstringDescripción detallada (soporta markdown en embeds).
guildIdstringID de guild de Discord (requerido para contexto guild).
channelIdstringID de canal de Discord.

Cada entrada de log se persiste en la colección Logs:

CampoTipoDescripción
titlestringTítulo del log.
descriptionstringDescripción del log.
createdAtDateMarca de tiempo de la entrada.

El módulo extiende el modelo Guild con:

CampoTipoDescripción
logChannelstring (opcional)ID del canal donde se enviarán los logs de la guild. Aquí es donde se envían los logs con context: 'guild'.

Usa el servicio GuildDataGetter para configurar qué canal recibe los logs de la guild:

const guildData = ServiceContainer.getService('GuildDataGetter');
await guildData.set('guildId', 'logChannel', 'channelId');
  1. Llamas a logger.log(data).
  2. Si context es 'guild':
    • Se verifica la configuración logChannel de la guild.
    • Si hay un canal configurado, se envía un embed a ese canal.
  3. La entrada de log siempre se persiste en la base de datos.

Cualquier módulo puede consumir el servicio LogManager:

import { Module, ServiceContainer } from 'zumito-framework';
class MiModulo extends Module {
async onReady() {
const logger = ServiceContainer.getService('LogManager');
await logger.log({
context: 'bot',
title: 'MiModulo listo',
description: 'MiModulo se ha inicializado exitosamente.'
});
}
}

El LogManager es un servicio estándar. Puedes extenderlo o envolverlo:

class LogManagerMejorado extends LogManager {
async log(data: LogData) {
// Agregar lógica personalizada antes de registrar
if (data.context === 'guild') {
// Enviar también a un webhook
await fetch(webhookUrl, { method: 'POST', body: JSON.stringify(data) });
}
return super.log(data);
}
}

Como los logs se almacenan en la base de datos, puedes consultarlos para dashboards o analíticas:

import { DatabaseModel } from 'zumito-framework';
const LogsModel = new DatabaseModel('Logs');
const erroresRecientes = await LogsModel.findMany({
filter: { title: { $regex: /error/i } },
sort: { createdAt: -1 },
limit: 10
});
  • ejs — Renderizado de plantillas.
  • zumito-framework