import * as winston from 'winston'; import 'winston-daily-rotate-file'; import * as path from 'path'; // Define log levels const levels = { error: 0, warn: 1, info: 2, http: 3, debug: 4, }; // Define log level based on environment const level = () => { const env = process.env.NODE_ENV || 'development'; return env === 'development' ? 'debug' : 'warn'; }; // Define colors for each level const colors = { error: 'red', warn: 'yellow', info: 'green', http: 'magenta', debug: 'blue', }; // Add colors to winston winston.addColors(colors); // Custom format for logging const format = winston.format.combine( winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }), winston.format.colorize({ all: true }), winston.format.printf( (info) => `${info.timestamp} ${info.level}: ${info.message}` ) ); // Define file transport options const fileRotateTransport = new winston.transports.DailyRotateFile({ filename: path.join('logs', '%DATE%-server.log'), datePattern: 'YYYY-MM-DD', zippedArchive: true, maxSize: '20m', maxFiles: '14d', format: winston.format.combine( winston.format.uncolorize(), winston.format.timestamp(), winston.format.json() ), }); // Create the logger const logger = winston.createLogger({ level: level(), levels, format, transports: [ new winston.transports.Console({ format: winston.format.combine( winston.format.colorize(), winston.format.simple() ), }), fileRotateTransport, ], }); // Create a stream object for Morgan middleware const stream = { write: (message: string) => { logger.http(message.trim()); }, }; export { logger, stream };