(level: LogLevel, message: string, meta?: any)
| 38 | } |
| 39 | |
| 40 | const formatMessage = (level: LogLevel, message: string, meta?: any): string => { |
| 41 | const timestamp = new Date().toISOString() |
| 42 | const safeMeta = meta ? redactSecrets(meta) : undefined |
| 43 | |
| 44 | if (process.env.NODE_ENV === 'production') { |
| 45 | // Structured JSON for production |
| 46 | return JSON.stringify({ |
| 47 | timestamp, |
| 48 | level, |
| 49 | message, |
| 50 | service: 'docbase', |
| 51 | ...safeMeta |
| 52 | }) |
| 53 | } else { |
| 54 | // Human readable for development |
| 55 | const metaStr = safeMeta ? ` ${JSON.stringify(safeMeta, null, 2)}` : '' |
| 56 | return `[${timestamp}] ${level.toUpperCase()}: ${message}${metaStr}` |
| 57 | } |
| 58 | } |
| 59 | |
| 60 | export const logger = { |
| 61 | debug: (message: string, meta?: any) => { |
no test coverage detected