¿Qué es Winston y para qué sirve?
Winston es una biblioteca potente y flexible para el registro de logs (logging) en aplicaciones TypeScript y JavaScript. Permite escribir logs en diferentes destinos (consola, archivos, bases de datos) con distintos niveles de importancia. A diferencia del simple console.log, Winston ofrece control total sobre el formato de los logs, su rotación y filtrado.
¿Para qué usar Winston? En proyectos grandes, la salida estándar de la consola se vuelve inútil: los logs se mezclan, se pierden y no se pueden analizar. Winston resuelve estos problemas: puedes configurar el registro de errores en un archivo separado, los mensajes informativos en la consola y los datos de depuración en una base de datos. Esto es fundamental para la depuración, el monitoreo y la auditoría.
Instalación
Para instalar Winston en un proyecto TypeScript, ejecuta el comando:
npm install winstonTambién se recomienda instalar los tipos:
npm install --save-dev @types/winstonSi usas yarn:
yarn add winstonFunciones principales
- Niveles de logging: error, warn, info, http, verbose, debug, silly. Cada nivel tiene una prioridad, y puedes configurar qué niveles se muestran en diferentes transportes.
- Transportes: formas de salida de los logs. Integrados: Console, File, Http, Stream. Puedes crear los tuyos propios.
- Formatos: personalización de la apariencia de los logs (JSON, timestamp, salida con colores).
- Rotación de archivos: a través del módulo adicional
winston-daily-rotate-filepuedes crear automáticamente nuevos archivos de logs por día o tamaño. - Metadatos: transmisión de contexto adicional (por ejemplo, ID de solicitud, nombre de usuario).
Ejemplo de código en TypeScript
Creemos un logger simple con salida a consola y archivo:
import winston from 'winston';
const logger = winston.createLogger({ level: 'info', format: winston.format.combine( winston.format.timestamp(), winston.format.json() ), transports: [ new winston.transports.Console({ format: winston.format.combine( winston.format.colorize(), winston.format.simple() ) }), new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'combined.log' }) ]});
// Usologger.info('Servidor iniciado en el puerto 3000');logger.error('Error de conexión a la base de datos', { database: 'main' });En este ejemplo: los mensajes informativos se muestran en la consola (con colores) y en el archivo combined.log, mientras que los errores se guardan adicionalmente en error.log. El formato de los logs es JSON con marca de tiempo.
¿Cuándo usar Winston?
- En entornos de producción para el monitoreo de errores.
- En arquitecturas de microservicios para recopilar logs en un almacenamiento centralizado.
- Cuando se requiere auditoría de las acciones de los usuarios.
- En proyectos donde se necesita analizar logs con ELK (Elasticsearch, Logstash, Kibana) u otros sistemas.
Winston es el estándar de la industria para el logging en TypeScript. Es fácil de configurar, pero se escala para cumplir con requisitos complejos.