export enum LogLevel { ERROR = 'ERROR', WARN = 'WARN', INFO = 'INFO', DEBUG = 'DEBUG' } class Logger { private isDevelopment: boolean; constructor() { this.isDevelopment = process.env.NODE_ENV === 'development'; } private formatMessage(level: LogLevel, message: string, meta?: any): string { const timestamp = new Date().toISOString(); const baseMessage = `[${timestamp}] [${level}] ${message}`; if (meta && this.isDevelopment) { return `${baseMessage} ${JSON.stringify(meta, null, 2)}`; } return baseMessage; } error(message: string, meta?: any): void { console.error(this.formatMessage(LogLevel.ERROR, message, meta)); } warn(message: string, meta?: any): void { console.warn(this.formatMessage(LogLevel.WARN, message, meta)); } info(message: string, meta?: any): void { console.info(this.formatMessage(LogLevel.INFO, message, meta)); } debug(message: string, meta?: any): void { if (this.isDevelopment) { console.debug(this.formatMessage(LogLevel.DEBUG, message, meta)); } } // Request logging middleware requestLogger() { return (req: any, res: any, next: any) => { const start = Date.now(); res.on('finish', () => { const duration = Date.now() - start; const logMessage = `${req.method} ${req.originalUrl} - ${res.statusCode} - ${duration}ms`; if (res.statusCode >= 400) { this.error(logMessage, { ip: req.ip, userAgent: req.get('User-Agent'), body: req.body, params: req.params, query: req.query }); } else { this.info(logMessage); } }); next(); }; } } export const logger = new Logger(); export default logger;