Encontranos en redes
LoggingDebugWinston5 min de lectura
Logging y debugging del bot
Configurar Winston o Pino para Node.js, módulo logging de Python, niveles de log y rotación.
¿Por qué logging estructurado?
El console.log no escala. Necesitás niveles de log, timestamps, rotación de archivos y formato consistente para diagnosticar problemas en producción.
Node.js: Winston
bash
npm install winston winston-daily-rotate-filejavascript
const winston = require('winston');
require('winston-daily-rotate-file');
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info',
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.errors({ stack: true }),
winston.format.json()
),
transports: [
new winston.transports.Console({
format: winston.format.combine(
winston.format.colorize(),
winston.format.simple()
)
}),
new winston.transports.DailyRotateFile({
filename: 'logs/bot-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '14d'
})
]
});
// Uso
logger.info('Bot iniciado', { guilds: client.guilds.cache.size });
logger.warn('Rate limit cercano', { bucket: '/channels/123' });
logger.error('Error en comando', { command: 'ban', error: err.message });Node.js: Pino (más rápido)
bash
npm install pino pino-prettyjavascript
const pino = require('pino');
const logger = pino({
level: process.env.LOG_LEVEL || 'info',
transport: {
target: 'pino-pretty',
options: { colorize: true, translateTime: 'SYS:standard' }
}
});
logger.info({ event: 'ready', guilds: 42 }, 'Bot conectado');Python: módulo logging
python
import logging
from logging.handlers import RotatingFileHandler
def setup_logging():
logger = logging.getLogger('discord_bot')
logger.setLevel(logging.INFO)
# Formato
formatter = logging.Formatter(
'%(asctime)s | %(levelname)-8s | %(name)s | %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
# Consola
console = logging.StreamHandler()
console.setFormatter(formatter)
logger.addHandler(console)
# Archivo con rotación
file_handler = RotatingFileHandler(
'logs/bot.log', maxBytes=10*1024*1024, backupCount=5
)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
return logger
logger = setup_logging()
logger.info('Bot iniciado con %d guilds', len(bot.guilds))Ver logs en producción
bash
# PM2 logs en tiempo real
pm2 logs mi-bot --lines 100
# Systemd/journalctl
journalctl -u discord-bot -f
journalctl -u discord-bot --since '1 hour ago'
# Buscar errores específicos
grep -i 'error' logs/bot-2026-01-15.logConfigurar logrotate del sistema
bash
sudo nano /etc/logrotate.d/discord-botterminal
/opt/bots/*/logs/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
}Recomendaciones
- Usá niveles: error > warn > info > debug
- Nunca loguees tokens o datos sensibles
- Configurá rotación para evitar llenar el disco
- En producción usá nivel
info; en desarrollodebug - Incluí contexto relevante (guild_id, user_id, command) en cada log
¿Te resultó útil esta guía?