FEAT: Implementação de sistema de logs com Winston

- Adiciona logs profissionais com Winston
- Suporta ambientes de desenvolvimento e produção via NODE_ENV
- Distingue operações de INSERT e UPDATE nos logs
- Configura arquivos de log na pasta logs/
This commit is contained in:
Rafael Alves Lopes 2025-09-05 20:27:35 -03:00
parent cb73486caa
commit f69f2a7c9f
3 changed files with 1125 additions and 16 deletions

1066
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -11,7 +11,9 @@
"dependencies": { "dependencies": {
"axios": "^0.21.4", "axios": "^0.21.4",
"dotenv": "^10.0.0", "dotenv": "^10.0.0",
"pg": "^8.7.1" "express": "^5.1.0",
"pg": "^8.7.1",
"winston": "^3.17.0"
}, },
"author": "Your Name", "author": "Your Name",
"license": "MIT" "license": "MIT"

View File

@ -1,39 +1,82 @@
const winston = require('winston'); const winston = require('winston');
const path = require('path'); const path = require('path');
const fs = require('fs');
// Create a logger instance with specified settings // 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({ const logger = winston.createLogger({
level: 'info', level: 'info',
format: winston.format.combine( format: winston.format.combine(
winston.format.timestamp(), winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss'
}),
winston.format.errors({ stack: true }), // ← Mostra stack trace de erros
winston.format.json() winston.format.json()
), ),
transports: [ transports: [
// Log to a file for application events // Log geral da aplicação
new winston.transports.File({ filename: path.join(__dirname, '../../logs/app.log') }), new winston.transports.File({
// Log to a file for error events filename: path.join(logsDir, 'app.log'),
new winston.transports.File({ filename: path.join(__dirname, '../../logs/error.log'), level: 'error' }), maxsize: 5242880, // 5MB
maxFiles: 5
}),
// Log de erros
new winston.transports.File({
filename: path.join(logsDir, 'error.log'),
level: 'error',
maxsize: 5242880,
maxFiles: 3
}),
], ],
}); });
// If not in production, log to the console as well // Log no console em desenvolvimento
if (process.env.NODE_ENV !== 'production') { if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({ logger.add(new winston.transports.Console({
format: winston.format.simple(), format: winston.format.combine(
winston.format.colorize(),
winston.format.printf(({ timestamp, level, message, stack }) => {
return `${timestamp} [${level}]: ${stack || message}`;
})
)
})); }));
} }
// Utility function to log errors // Funções utilitárias
const logError = (error) => { const logError = (error, context = '') => {
logger.error(error); if (error instanceof Error) {
logger.error(`${context} - ${error.message}`, { stack: error.stack });
} else {
logger.error(`${context} - ${error}`);
}
}; };
// Utility function to log info messages const logInfo = (message, meta = {}) => {
const logInfo = (message) => { logger.info(message, meta);
logger.info(message); };
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 = { module.exports = {
logger,
logError, logError,
logInfo, logInfo,
logWarning,
logSync
}; };