/** * Structured Logger Utility * * Provides tagged, level-aware logging for consistent output across the application. * Respects LOG_LEVEL environment variable and NODE_ENV for default levels. * * Usage: * import { logger } from '@/lib/logger' * logger.info('AI Assignment', 'Processing batch', { batchSize: 15 }) * logger.error('Storage', 'Upload failed', error) */ type LogLevel = 'debug' | 'info' | 'warn' | 'error' const LOG_LEVELS: Record = { debug: 0, info: 1, warn: 2, error: 3, } function getConfiguredLevel(): LogLevel { const envLevel = process.env.LOG_LEVEL?.toLowerCase() if (envLevel && envLevel in LOG_LEVELS) { return envLevel as LogLevel } return process.env.NODE_ENV === 'production' ? 'warn' : 'debug' } function shouldLog(level: LogLevel): boolean { return LOG_LEVELS[level] >= LOG_LEVELS[getConfiguredLevel()] } function formatTimestamp(): string { return new Date().toISOString() } export const logger = { debug: (tag: string, message: string, data?: unknown): void => { if (shouldLog('debug')) { console.debug(`${formatTimestamp()} [DEBUG] [${tag}]`, message, data ?? '') } }, info: (tag: string, message: string, data?: unknown): void => { if (shouldLog('info')) { console.info(`${formatTimestamp()} [INFO] [${tag}]`, message, data ?? '') } }, warn: (tag: string, message: string, data?: unknown): void => { if (shouldLog('warn')) { console.warn(`${formatTimestamp()} [WARN] [${tag}]`, message, data ?? '') } }, error: (tag: string, message: string, data?: unknown): void => { if (shouldLog('error')) { console.error(`${formatTimestamp()} [ERROR] [${tag}]`, message, data ?? '') } }, }