const { format } = require('winston'); const winston = require('winston'); const DailyRotateFile = require('winston-daily-rotate-file'); const logPrefix = (label) => { if (label === 'server') { return '[\x1b[32mServer\x1b[0m] '; } else if (label === 'client') { return '[\x1b[34mClient\x1b[0m] '; } else if (label === 'Internal-Server-Error') { return '[\x1b[38;5;9mInternal-Error\x1b[0m] '; } else if (label === 'Authentification') { return '[\x1b[33mAuthentification\x1b[0m] '; } return ''; }; const createDailyRotateFileTransport = () => { return new DailyRotateFile({ filename: 'logs/log-%DATE%.log', datePattern: 'YYYY-MM-DD', zippedArchive: false, maxSize: '20m', maxFiles: '14d' }); }; const logger = winston.createLogger({ format: format.combine( format.label({ label: 'server' }), format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), format.printf(info => { const { timestamp, level, label, message } = info; const prefix = logPrefix(label); return `[${timestamp}] ${prefix}${message}`; }) ), transports: [ new winston.transports.Console(), createDailyRotateFileTransport() ] }); const ErrorLogger = winston.createLogger({ format: format.combine( format.label({ label: 'Internal-Server-Error' }), format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), format.printf(info => { const { timestamp, level, label, message } = info; const prefix = logPrefix(label); return `[${timestamp}] ${prefix}${message}`; }) ), transports: [ new winston.transports.Console(), createDailyRotateFileTransport() ] }); const clientLogger = winston.createLogger({ format: format.combine( format.label({ label: 'client' }), format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), format.printf(info => { const { timestamp, level, label, message } = info; const prefix = logPrefix(label); return `[${timestamp}] ${prefix}${message}`; }) ), transports: [ new winston.transports.Console(), createDailyRotateFileTransport() ] }); const authLogger = winston.createLogger({ format: format.combine( format.label({ label: 'Authentification' }), format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), format.printf(info => { const { timestamp, level, label, message } = info; const prefix = logPrefix(label); return `[${timestamp}] ${prefix}${message}`; }) ), transports: [ new winston.transports.Console(), createDailyRotateFileTransport() ] }); const logRequestInfo = (req, res, next) => { const ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; const userAgent = req.headers['user-agent']; req.log = clientLogger; req.log.info(`[${ip}] - ${userAgent} - ${req.method} ${req.url}`); next(); }; module.exports = { logger, clientLogger, ErrorLogger, logRequestInfo, authLogger };