* Format data for logging * Separates Error objects from data: JSON for regular data, stack trace appended separately
(data: unknown)
| 227 | * Separates Error objects from data: JSON for regular data, stack trace appended separately |
| 228 | */ |
| 229 | function formatData(data: unknown): string { |
| 230 | if (data === undefined || data === null) return ''; |
| 231 | if (data instanceof Error) { |
| 232 | return data.stack || data.message; |
| 233 | } |
| 234 | if (typeof data === 'object') { |
| 235 | try { |
| 236 | // Separate Error objects from regular data |
| 237 | const regularData: Record<string, unknown> = {}; |
| 238 | const errors: string[] = []; |
| 239 | |
| 240 | for (const key of Object.keys(data as Record<string, unknown>)) { |
| 241 | const value = (data as Record<string, unknown>)[key]; |
| 242 | if (value instanceof Error) { |
| 243 | errors.push(value.stack || `${value.name}: ${value.message}`); |
| 244 | } else { |
| 245 | regularData[key] = value; |
| 246 | } |
| 247 | } |
| 248 | |
| 249 | const parts: string[] = []; |
| 250 | if (Object.keys(regularData).length > 0) { |
| 251 | parts.push(JSON.stringify(regularData)); |
| 252 | } |
| 253 | if (errors.length > 0) { |
| 254 | parts.push(errors.join('\n')); |
| 255 | } |
| 256 | |
| 257 | return parts.join(', '); |
| 258 | } catch { |
| 259 | return String(data); |
| 260 | } |
| 261 | } |
| 262 | return String(data); |
| 263 | } |
| 264 | |
| 265 | export class Logger { |
| 266 | private static instance: Logger; |