import { loadEnvConfig } from '../config/env'; type LogLevel = 'debug' | 'info' | 'warn' | 'error'; interface LogContext { [key: string]: any; } /** * Structured logger with standard log levels */ class Logger { private logLevel: LogLevel; private logLevels: Record = { debug: 0, info: 1, warn: 2, error: 3, }; constructor() { const config = loadEnvConfig(); this.logLevel = config.logLevel || 'info'; } /** * Log a debug message * @param message Message to log * @param context Optional context to include */ debug(message: string, context?: LogContext | unknown): void { this.log('debug', message, context); } /** * Log an info message * @param message Message to log * @param context Optional context to include */ info(message: string, context?: LogContext | unknown): void { this.log('info', message, context); } /** * Log a warning message * @param message Message to log * @param context Optional context to include */ warn(message: string, context?: LogContext | unknown): void { this.log('warn', message, context); } /** * Log an error message * @param message Message to log * @param context Optional context to include (error object or additional context) */ error(message: string, context?: Error | LogContext | unknown): void { this.log('error', message, context); } /** * Internal log method * @param level Log level * @param message Message to log * @param context Optional context to include */ private log(level: LogLevel, message: string, context?: LogContext | unknown): void { if (this.logLevels[level] < this.logLevels[this.logLevel]) { return; } const timestamp = new Date().toISOString(); const logObject = { timestamp, level, message, ...(context && typeof context === 'object' && !Array.isArray(context) ? context : {}) }; // Format for structured logging (JSON) const formattedLog = JSON.stringify(logObject); switch (level) { case 'debug': console.debug(formattedLog); break; case 'info': console.info(formattedLog); break; case 'warn': console.warn(formattedLog); break; case 'error': console.error(formattedLog); break; } } } // Export a singleton instance export const logger = new Logger();