60 lines
1.7 KiB
TypeScript
60 lines
1.7 KiB
TypeScript
/**
|
|
* 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<LogLevel, number> = {
|
|
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 ?? '')
|
|
}
|
|
},
|
|
}
|