const winston = require('winston'); const path = require('path'); const fs = require('fs'); // verifica se a pasta de logs existe, se não, cria const logsDir = path.join(__dirname, '../../logs'); if (!fs.existsSync(logsDir)) { fs.mkdirSync(logsDir, { recursive: true }); } // Configuração do logger com winston const logger = winston.createLogger({ level: 'info', format: winston.format.combine( winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston.format.errors({ stack: true }), // ← Mostra stack trace de erros winston.format.json() ), transports: [ // Log geral da aplicação new winston.transports.File({ filename: path.join(logsDir, 'app.log'), maxsize: 5242880, // 5MB maxFiles: 5 }), // Log de erros new winston.transports.File({ filename: path.join(logsDir, 'error.log'), level: 'error', maxsize: 5242880, maxFiles: 3 }), ], }); // Log no console em desenvolvimento if (process.env.NODE_ENV !== 'production') { logger.add(new winston.transports.Console({ format: winston.format.combine( winston.format.colorize(), winston.format.printf(({ timestamp, level, message, stack }) => { return `${timestamp} [${level}]: ${stack || message}`; }) ) })); } // Funções utilitárias const logError = (error, context = '') => { if (error instanceof Error) { logger.error(`${context} - ${error.message}`, { stack: error.stack }); } else { logger.error(`${context} - ${error}`); } }; const logInfo = (message, meta = {}) => { logger.info(message, meta); }; const logWarning = (message, meta = {}) => { logger.warn(message, meta); }; // Log de sincronização específico const logSync = (service, count, type) => { logger.info(`SYNC: ${service} - ${count} ${type} sincronizados`, { service, count, type }); }; module.exports = { logger, logError, logInfo, logWarning, logSync };