import winston from 'winston'; import { config } from '../config'; /** * Logger profesional usando Winston */ const customFormat = winston.format.combine( winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston.format.errors({ stack: true }), winston.format.splat(), winston.format.json() ); const consoleFormat = winston.format.combine( winston.format.colorize(), winston.format.timestamp({ format: 'HH:mm:ss' }), winston.format.printf(({ level, message, timestamp, ...meta }) => { let msg = `${timestamp} [${level}] ${message}`; if (Object.keys(meta).length > 0 && meta.stack) { msg += `\n${meta.stack}`; } else if (Object.keys(meta).length > 0) { msg += `\n${JSON.stringify(meta, null, 2)}`; } return msg; }) ); export const logger = winston.createLogger({ level: config.logLevel, format: customFormat, defaultMeta: { service: config.appName }, transports: [ // Escribir logs a archivos new winston.transports.File({ filename: 'logs/error.log', level: 'error' }), new winston.transports.File({ filename: 'logs/combined.log' }), ], }); // En desarrollo, tambiƩn mostrar en consola if (config.nodeEnv === 'development') { logger.add( new winston.transports.Console({ format: consoleFormat, }) ); } export default logger;