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-file
javascript
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-pretty
javascript
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.log

Configurar logrotate del sistema

bash
sudo nano /etc/logrotate.d/discord-bot
terminal
/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 desarrollo debug
  • Incluí contexto relevante (guild_id, user_id, command) en cada log

¿Te resultó útil esta guía?