import winston from 'winston'; /** * EN: Configuration interface for logger setup * VI: Interface cấu hình cho việc thiết lập logger */ export interface LoggerConfig { /** EN: Logging level (error, warn, info, debug) / VI: Mức độ ghi log (error, warn, info, debug) */ level?: string; /** EN: Service name for log identification / VI: Tên service để xác định log */ serviceName?: string; /** EN: Enable console output / VI: Bật output console */ enableConsole?: boolean; /** EN: Enable file output / VI: Bật output file */ enableFile?: boolean; /** EN: Directory for log files / VI: Thư mục cho các file log */ logDir?: string; } /** * EN: Default logger configuration with environment variable fallbacks * VI: Cấu hình logger mặc định với fallback từ biến môi trường */ const defaultConfig: Required = { level: process.env.LOG_LEVEL || 'info', serviceName: process.env.SERVICE_NAME || 'microservice', enableConsole: true, enableFile: false, logDir: './logs', }; /** * EN: Create a Winston logger instance with custom configuration * VI: Tạo instance Winston logger với cấu hình tùy chỉnh * * @param config - Logger configuration options / Tùy chọn cấu hình logger * @returns Configured Winston logger instance / Instance Winston logger đã cấu hình */ export const createLogger = (config: LoggerConfig = {}) => { // EN: Merge user config with defaults // VI: Hợp nhất config người dùng với mặc định const finalConfig = { ...defaultConfig, ...config }; // EN: Array to hold Winston transport instances // VI: Mảng chứa các instance transport của Winston const transports: winston.transport[] = []; // EN: Add console transport if enabled // VI: Thêm console transport nếu được bật if (finalConfig.enableConsole) { transports.push( new winston.transports.Console({ format: winston.format.combine( winston.format.timestamp(), winston.format.colorize(), winston.format.printf(({ timestamp, level, message, service, ...meta }) => { // EN: Format log message with timestamp, level, service tag, and metadata // VI: Định dạng thông điệp log với timestamp, level, service tag, và metadata const serviceTag = service ? `[${service}]` : ''; const metaStr = Object.keys(meta).length ? JSON.stringify(meta) : ''; return `${timestamp} ${level} ${serviceTag} ${message} ${metaStr}`; }) ), }) ); } // EN: Add file transports if enabled // VI: Thêm file transports nếu được bật if (finalConfig.enableFile) { transports.push( new winston.transports.File({ filename: `${finalConfig.logDir}/error.log`, level: 'error', format: winston.format.combine( winston.format.timestamp(), winston.format.json() ), }), new winston.transports.File({ filename: `${finalConfig.logDir}/combined.log`, format: winston.format.combine( winston.format.timestamp(), winston.format.json() ), }) ); } // EN: Create and return Winston logger instance // VI: Tạo và trả về instance Winston logger return winston.createLogger({ level: finalConfig.level, defaultMeta: { service: finalConfig.serviceName, }, transports, }); }; /** * EN: Default logger instance using default configuration * VI: Instance logger mặc định sử dụng cấu hình mặc định */ export const logger = createLogger(); // EN: Default export for convenience // VI: Export default để thuận tiện export default logger;