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": {
"axios": "^0.21.4",
"dotenv": "^10.0.0",
"pg": "^8.7.1"
"express": "^5.1.0",
"pg": "^8.7.1",
"winston": "^3.17.0"
},
"author": "Your Name",
"license": "MIT"

View File

@ -1,39 +1,82 @@
const winston = require('winston');
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({
level: 'info',
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()
),
transports: [
// Log to a file for application events
new winston.transports.File({ filename: path.join(__dirname, '../../logs/app.log') }),
// Log to a file for error events
new winston.transports.File({ filename: path.join(__dirname, '../../logs/error.log'), level: 'error' }),
// 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
}),
],
});
// If not in production, log to the console as well
// Log no console em desenvolvimento
if (process.env.NODE_ENV !== 'production') {
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
const logError = (error) => {
logger.error(error);
// 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}`);
}
};
// Utility function to log info messages
const logInfo = (message) => {
logger.info(message);
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
};