From 7a8e542ada46b1d38b331f17f29a5fc229060d2b Mon Sep 17 00:00:00 2001 From: Boki Date: Fri, 20 Jun 2025 07:32:10 -0400 Subject: [PATCH] added trace and fetal to logger --- libs/config/src/schemas/service.schema.ts | 2 +- libs/logger/src/logger.ts | 34 ++++++++++++++++++++++- libs/logger/src/types.ts | 2 +- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/libs/config/src/schemas/service.schema.ts b/libs/config/src/schemas/service.schema.ts index c3625ec..10f11e5 100644 --- a/libs/config/src/schemas/service.schema.ts +++ b/libs/config/src/schemas/service.schema.ts @@ -17,7 +17,7 @@ export const serviceConfigSchema = z.object({ // Logging configuration export const loggingConfigSchema = z.object({ - level: z.enum(['debug', 'info', 'warn', 'error']).default('info'), + level: z.enum(['trace', 'debug', 'info', 'warn', 'error', 'fatal']).default('info'), format: z.enum(['json', 'pretty']).default('json'), loki: z.object({ enabled: z.boolean().default(false), diff --git a/libs/logger/src/logger.ts b/libs/logger/src/logger.ts index 194c23d..aabd973 100644 --- a/libs/logger/src/logger.ts +++ b/libs/logger/src/logger.ts @@ -16,7 +16,7 @@ const loggerCache = new Map(); // Global config that can be set let globalConfig: LoggerConfig = { - logLevel: 'info', + logLevel: 'info', // Default to info, but trace and fatal are supported logConsole: true, logFile: false, logFilePath: './logs', @@ -150,6 +150,10 @@ export class Logger { } // Simple log level methods + trace(message: string | object, metadata?: LogMetadata): void { + this.log('trace', message, metadata); + } + debug(message: string | object, metadata?: LogMetadata): void { this.log('debug', message, metadata); } @@ -194,6 +198,34 @@ export class Logger { this.log('error', message, data); } + fatal(message: string | object, metadata?: (LogMetadata & { error?: any }) | unknown): void { + let data: any = {}; + + // Handle metadata parameter normalization (same as error) + if (metadata instanceof Error) { + data = { error: metadata }; + } else if (metadata !== null && typeof metadata === 'object') { + data = { ...metadata }; + } else if (metadata !== undefined) { + data = { metadata }; + } + + // Normalize error objects in the data + const errorKeys = ['error', 'err', 'primaryError', 'secondaryError']; + errorKeys.forEach(key => { + if (data[key]) { + const normalizedKey = key === 'error' ? 'err' : `${key}_normalized`; + data[normalizedKey] = this.normalizeError(data[key]); + + if (key === 'error') { + delete data.error; + } + } + }); + + this.log('fatal', message, data); + } + /** * Normalize any error type to a structured format */ diff --git a/libs/logger/src/types.ts b/libs/logger/src/types.ts index 3cde37a..9e35776 100644 --- a/libs/logger/src/types.ts +++ b/libs/logger/src/types.ts @@ -3,7 +3,7 @@ */ // Standard log levels (simplified to pino defaults) -export type LogLevel = 'debug' | 'info' | 'warn' | 'error'; +export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal'; // Context that persists across log calls export interface LogContext {