logixia 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{index-BDRSTjUt.d.ts → index-CHIsdA9n.d.ts} +53 -2
- package/dist/index-CHIsdA9n.d.ts.map +1 -0
- package/dist/{index-Drrzn-Yg.d.mts → index-iDTW2-eY.d.mts} +53 -2
- package/dist/index-iDTW2-eY.d.mts.map +1 -0
- package/dist/index.d.mts +89 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +89 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -3
- package/dist/index.mjs.map +1 -1
- package/dist/{logitron-logger.module-iO8DPE7_.mjs → logitron-logger.module-2AzkadqZ.mjs} +226 -8
- package/dist/logitron-logger.module-2AzkadqZ.mjs.map +1 -0
- package/dist/{logitron-logger.module-X6nGDVGC.js → logitron-logger.module-BqNKp0Fs.js} +240 -4
- package/dist/logitron-logger.module-BqNKp0Fs.js.map +1 -0
- package/dist/{logitron-logger.module-CY3t8yK6.d.mts → logitron-logger.module-C0G8JGVf.d.ts} +6 -4
- package/dist/logitron-logger.module-C0G8JGVf.d.ts.map +1 -0
- package/dist/{logitron-logger.module-DgEldK9V.d.ts → logitron-logger.module-DQKaZTJL.d.mts} +6 -4
- package/dist/logitron-logger.module-DQKaZTJL.d.mts.map +1 -0
- package/dist/middleware.d.mts +83 -0
- package/dist/middleware.d.mts.map +1 -0
- package/dist/middleware.d.ts +83 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +132 -0
- package/dist/middleware.js.map +1 -0
- package/dist/middleware.mjs +130 -0
- package/dist/middleware.mjs.map +1 -0
- package/dist/nest.d.mts +2 -2
- package/dist/nest.d.ts +2 -2
- package/dist/nest.js +2 -2
- package/dist/nest.mjs +2 -2
- package/dist/testing.d.mts +67 -0
- package/dist/testing.d.mts.map +1 -0
- package/dist/testing.d.ts +67 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +164 -0
- package/dist/testing.js.map +1 -0
- package/dist/testing.mjs +163 -0
- package/dist/testing.mjs.map +1 -0
- package/dist/{transport.manager-Vi__pagn.mjs → transport.manager-5VVdqS3o.mjs} +51 -2
- package/dist/transport.manager-5VVdqS3o.mjs.map +1 -0
- package/dist/{transport.manager-C3Xr7Tvi.js → transport.manager-DCOm4uIQ.js} +51 -2
- package/dist/transport.manager-DCOm4uIQ.js.map +1 -0
- package/dist/transports.d.mts +38 -1
- package/dist/transports.d.mts.map +1 -1
- package/dist/transports.d.ts +38 -1
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +1 -1
- package/dist/transports.mjs +1 -1
- package/package.json +21 -1
- package/dist/index-BDRSTjUt.d.ts.map +0 -1
- package/dist/index-Drrzn-Yg.d.mts.map +0 -1
- package/dist/logitron-logger.module-CY3t8yK6.d.mts.map +0 -1
- package/dist/logitron-logger.module-DgEldK9V.d.ts.map +0 -1
- package/dist/logitron-logger.module-X6nGDVGC.js.map +0 -1
- package/dist/logitron-logger.module-iO8DPE7_.mjs.map +0 -1
- package/dist/transport.manager-C3Xr7Tvi.js.map +0 -1
- package/dist/transport.manager-Vi__pagn.mjs.map +0 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["formatted: Record<string, unknown>","serialized: Record<string, unknown>","parts: string[]","createLoggerFromCore"],"sources":["../src/formatters/json.formatter.ts","../src/formatters/text.formatter.ts","../src/index.ts"],"sourcesContent":["/**\n * JSON formatter for Logixia\n */\n\nimport type { ILogFormatter, LogEntry } from '../types';\nimport { serializeError } from '../utils/error.utils';\n\nexport class JsonFormatter implements ILogFormatter {\n private includeTimestamp: boolean;\n private includeLevel: boolean;\n private includeAppName: boolean;\n private includeTraceId: boolean;\n private includeContext: boolean;\n private prettyPrint: boolean;\n\n constructor(\n options: {\n includeTimestamp?: boolean;\n includeLevel?: boolean;\n includeAppName?: boolean;\n includeTraceId?: boolean;\n includeContext?: boolean;\n prettyPrint?: boolean;\n } = {}\n ) {\n this.includeTimestamp = options.includeTimestamp ?? true;\n this.includeLevel = options.includeLevel ?? true;\n this.includeAppName = options.includeAppName ?? true;\n this.includeTraceId = options.includeTraceId ?? true;\n this.includeContext = options.includeContext ?? true;\n this.prettyPrint = options.prettyPrint ?? false;\n }\n\n format(entry: LogEntry): string {\n const formatted: Record<string, unknown> = {};\n\n // Add timestamp\n if (this.includeTimestamp) {\n formatted.timestamp = entry.timestamp;\n }\n\n // Add log level\n if (this.includeLevel) {\n formatted.level = entry.level.toLowerCase();\n formatted.levelValue = entry.level;\n }\n\n // Add app name\n if (this.includeAppName) {\n formatted.appName = entry.appName;\n }\n\n // Add trace ID\n if (this.includeTraceId && entry.traceId) {\n formatted.traceId = entry.traceId;\n }\n\n // Add context\n if (this.includeContext && entry.context) {\n formatted.context = entry.context;\n }\n\n // Add message\n formatted.message = entry.message;\n\n // Add payload\n if (entry.payload && Object.keys(entry.payload).length > 0) {\n formatted.payload = this.serializePayload(entry.payload);\n }\n\n // Add error if present\n if (entry.error) {\n formatted.error = serializeError(entry.error);\n }\n\n // Add metadata\n formatted.meta = {\n pid: process.pid,\n hostname: process.env.HOSTNAME || 'unknown',\n version: process.version,\n };\n\n return this.prettyPrint ? JSON.stringify(formatted, null, 2) : JSON.stringify(formatted);\n }\n\n private serializePayload(payload: Record<string, unknown>): Record<string, unknown> {\n const serialized: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(payload)) {\n try {\n if (value instanceof Error) {\n serialized[key] = serializeError(value);\n } else if (value instanceof Date) {\n serialized[key] = value.toISOString();\n } else if (typeof value === 'function') {\n serialized[key] = '[Function]';\n } else if (typeof value === 'symbol') {\n serialized[key] = value.toString();\n } else if (value === undefined) {\n serialized[key] = null;\n } else {\n serialized[key] = value;\n }\n } catch {\n serialized[key] = '[Unserializable]';\n }\n }\n\n return serialized;\n }\n}\n","/**\n * Text formatter for Logixia\n */\n\nimport type { ILogFormatter, LogEntry } from '../types';\nimport { LogLevel } from '../types';\n\nexport class TextFormatter implements ILogFormatter {\n private colorize: boolean;\n private includeTimestamp: boolean;\n private includeAppName: boolean;\n private includeTraceId: boolean;\n private includeContext: boolean;\n private timestampFormat: 'iso' | 'locale' | 'short';\n private colors: Record<string, string>;\n\n constructor(\n options: {\n colorize?: boolean;\n includeTimestamp?: boolean;\n includeAppName?: boolean;\n includeTraceId?: boolean;\n includeContext?: boolean;\n timestampFormat?: 'iso' | 'locale' | 'short';\n colors?: Record<string, string>;\n } = {}\n ) {\n this.colorize = options.colorize ?? true;\n this.includeTimestamp = options.includeTimestamp ?? true;\n this.includeAppName = options.includeAppName ?? true;\n this.includeTraceId = options.includeTraceId ?? true;\n this.includeContext = options.includeContext ?? true;\n this.timestampFormat = options.timestampFormat ?? 'locale';\n this.colors = {\n error: '\\x1b[31m', // Red\n warn: '\\x1b[33m', // Yellow\n info: '\\x1b[32m', // Green\n debug: '\\x1b[34m', // Blue\n trace: '\\x1b[35m', // Magenta\n verbose: '\\x1b[36m', // Cyan\n reset: '\\x1b[0m', // Reset\n bold: '\\x1b[1m', // Bold\n dim: '\\x1b[2m', // Dim\n ...options.colors,\n };\n }\n\n format(entry: LogEntry): string {\n const parts: string[] = [];\n\n // Add timestamp\n if (this.includeTimestamp) {\n const timestamp = this.formatTimestamp(entry.timestamp);\n parts.push(this.colorize ? `${this.colors.dim}${timestamp}${this.colors.reset}` : timestamp);\n }\n\n // Add log level\n const levelName = entry.level.toLowerCase();\n const levelColor = this.colors[levelName] || this.colors.reset;\n const formattedLevel = this.colorize\n ? `${levelColor}${this.colors.bold}${levelName.toUpperCase().padEnd(5)}${this.colors.reset}`\n : levelName.toUpperCase().padEnd(5);\n parts.push(`[${formattedLevel}]`);\n\n // Add app name\n if (this.includeAppName) {\n const appName = this.colorize\n ? `${this.colors.bold}${entry.appName}${this.colors.reset}`\n : entry.appName;\n parts.push(`[${appName}]`);\n }\n\n // Add trace ID\n if (this.includeTraceId && entry.traceId) {\n const traceId = this.colorize\n ? `${this.colors.dim}${entry.traceId}${this.colors.reset}`\n : entry.traceId;\n parts.push(`[${traceId}]`);\n }\n\n // Add context\n if (this.includeContext && entry.context) {\n const context = this.colorize\n ? `${this.colors.cyan}${entry.context}${this.colors.reset}`\n : entry.context;\n parts.push(`[${context}]`);\n }\n\n // Add message\n const message =\n this.colorize && entry.level === LogLevel.ERROR\n ? `${this.colors.error}${entry.message}${this.colors.reset}`\n : entry.message;\n parts.push(message);\n\n // Add payload\n if (entry.payload && Object.keys(entry.payload).length > 0) {\n const payload = this.formatPayload(entry.payload);\n if (payload) {\n parts.push(this.colorize ? `${this.colors.dim}${payload}${this.colors.reset}` : payload);\n }\n }\n\n return parts.join(' ');\n }\n\n private formatTimestamp(timestamp: string): string {\n const date = new Date(timestamp);\n\n switch (this.timestampFormat) {\n case 'iso':\n return date.toISOString();\n case 'short':\n return date.toLocaleTimeString();\n case 'locale':\n default:\n return date.toLocaleString();\n }\n }\n\n private formatPayload(payload: Record<string, unknown>): string {\n try {\n // Handle simple objects\n if (Object.keys(payload).length === 1) {\n const entry = Object.entries(payload)[0];\n if (entry) {\n const [key, value] = entry;\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return `${key}=${value}`;\n }\n }\n }\n\n // Handle multiple properties or complex objects\n const formatted = Object.entries(payload)\n .map(([key, value]) => {\n if (value === null || value === undefined) {\n return `${key}=${value}`;\n }\n if (typeof value === 'string') {\n return `${key}=\"${value}\"`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return `${key}=${value}`;\n }\n if (value instanceof Date) {\n return `${key}=${value.toISOString()}`;\n }\n if (typeof value === 'object') {\n return `${key}=${JSON.stringify(value)}`;\n }\n return `${key}=${String(value)}`;\n })\n .join(' ');\n\n return formatted;\n } catch {\n return JSON.stringify(payload);\n }\n }\n\n /**\n * Create a formatter with preset configurations\n */\n static createSimple(): TextFormatter {\n return new TextFormatter({\n colorize: true,\n includeTimestamp: true,\n includeAppName: false,\n includeTraceId: false,\n includeContext: true,\n timestampFormat: 'short',\n });\n }\n\n static createDetailed(): TextFormatter {\n return new TextFormatter({\n colorize: true,\n includeTimestamp: true,\n includeAppName: true,\n includeTraceId: true,\n includeContext: true,\n timestampFormat: 'locale',\n });\n }\n\n static createMinimal(): TextFormatter {\n return new TextFormatter({\n colorize: false,\n includeTimestamp: false,\n includeAppName: false,\n includeTraceId: false,\n includeContext: false,\n });\n }\n}\n","/**\n * Logixia - Advanced TypeScript Logger\n *\n * A comprehensive logging library with support for:\n * - Multiple output formats (console, file, JSON)\n * - Trace ID tracking\n * - Performance monitoring\n * - NestJS integration\n * - Customizable log levels and colors\n * - Intelligent log search and aggregation\n * - Natural language query processing\n * - Pattern recognition and anomaly detection\n */\n\nimport { createLogger as createLoggerFromCore, LogixiaLogger } from './core/logitron-logger';\nimport { LogixiaLoggerService } from './core/logitron-nestjs.service';\nimport type { Environment, LogColor, LoggerConfig } from './types';\nimport { LogLevel } from './types';\n\n// Type exports\nexport * from './core/logitron-logger.module';\nexport * from './core/logitron-nestjs.service';\nexport * from './formatters';\nexport * from './types';\nexport * from './utils/error.utils';\nexport { applyRedaction, redactObject } from './utils/redact.utils';\nexport * from './utils/shutdown.utils';\nexport * from './utils/trace.utils';\n\n// Search module exports\nexport * from './search';\n\n// Core exports\nexport { DEFAULT_CONFIG, LogixiaLogger, LogixiaLoggerService };\n\n/**\n * Default configuration for Logixia logger\n */\nconst DEFAULT_CONFIG = {\n appName: 'App',\n environment: 'development' as Environment,\n traceId: true,\n format: {\n timestamp: true,\n colorize: true,\n json: false,\n },\n silent: false,\n levelOptions: {\n level: LogLevel.INFO,\n levels: {\n [LogLevel.ERROR]: 0,\n [LogLevel.WARN]: 1,\n [LogLevel.INFO]: 2,\n [LogLevel.DEBUG]: 3,\n [LogLevel.TRACE]: 4,\n [LogLevel.VERBOSE]: 5,\n },\n colors: {\n [LogLevel.ERROR]: 'red',\n [LogLevel.WARN]: 'yellow',\n [LogLevel.INFO]: 'blue',\n [LogLevel.DEBUG]: 'green',\n [LogLevel.TRACE]: 'gray',\n [LogLevel.VERBOSE]: 'cyan',\n } as Record<string, LogColor>,\n },\n fields: {\n timestamp: true,\n level: true,\n appName: true,\n traceId: true,\n message: true,\n payload: true,\n timeTaken: true,\n },\n outputs: ['console'],\n};\n\n/**\n * Create a new Logixia logger instance with TypeScript support for custom levels\n * @param config - Logger configuration\n * @returns Typed logger instance\n */\nexport const createLogger = createLoggerFromCore;\n\n/**\n * Create a new Logixia logger service for NestJS\n * @param config - Logger configuration\n * @returns LogixiaLoggerService instance\n */\nexport function createLoggerService(config?: Partial<LoggerConfig>): LogixiaLoggerService {\n return new LogixiaLoggerService({ ...DEFAULT_CONFIG, ...config });\n}\n\n/**\n * Default logger instance\n */\nexport const logger = new LogixiaLogger(DEFAULT_CONFIG);\n\n/**\n * Export default configuration for reference\n */\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["formatted: Record<string, unknown>","serialized: Record<string, unknown>","parts: string[]","createLoggerFromCore"],"sources":["../src/formatters/json.formatter.ts","../src/formatters/text.formatter.ts","../src/index.ts"],"sourcesContent":["/**\n * JSON formatter for Logixia\n */\n\nimport type { ILogFormatter, LogEntry } from '../types';\nimport { serializeError } from '../utils/error.utils';\n\nexport class JsonFormatter implements ILogFormatter {\n private includeTimestamp: boolean;\n private includeLevel: boolean;\n private includeAppName: boolean;\n private includeTraceId: boolean;\n private includeContext: boolean;\n private prettyPrint: boolean;\n\n constructor(\n options: {\n includeTimestamp?: boolean;\n includeLevel?: boolean;\n includeAppName?: boolean;\n includeTraceId?: boolean;\n includeContext?: boolean;\n prettyPrint?: boolean;\n } = {}\n ) {\n this.includeTimestamp = options.includeTimestamp ?? true;\n this.includeLevel = options.includeLevel ?? true;\n this.includeAppName = options.includeAppName ?? true;\n this.includeTraceId = options.includeTraceId ?? true;\n this.includeContext = options.includeContext ?? true;\n this.prettyPrint = options.prettyPrint ?? false;\n }\n\n format(entry: LogEntry): string {\n const formatted: Record<string, unknown> = {};\n\n // Add timestamp\n if (this.includeTimestamp) {\n formatted.timestamp = entry.timestamp;\n }\n\n // Add log level\n if (this.includeLevel) {\n formatted.level = entry.level.toLowerCase();\n formatted.levelValue = entry.level;\n }\n\n // Add app name\n if (this.includeAppName) {\n formatted.appName = entry.appName;\n }\n\n // Add trace ID\n if (this.includeTraceId && entry.traceId) {\n formatted.traceId = entry.traceId;\n }\n\n // Add context\n if (this.includeContext && entry.context) {\n formatted.context = entry.context;\n }\n\n // Add message\n formatted.message = entry.message;\n\n // Add payload\n if (entry.payload && Object.keys(entry.payload).length > 0) {\n formatted.payload = this.serializePayload(entry.payload);\n }\n\n // Add error if present\n if (entry.error) {\n formatted.error = serializeError(entry.error);\n }\n\n // Add metadata\n formatted.meta = {\n pid: process.pid,\n hostname: process.env.HOSTNAME || 'unknown',\n version: process.version,\n };\n\n return this.prettyPrint ? JSON.stringify(formatted, null, 2) : JSON.stringify(formatted);\n }\n\n private serializePayload(payload: Record<string, unknown>): Record<string, unknown> {\n const serialized: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(payload)) {\n try {\n if (value instanceof Error) {\n serialized[key] = serializeError(value);\n } else if (value instanceof Date) {\n serialized[key] = value.toISOString();\n } else if (typeof value === 'function') {\n serialized[key] = '[Function]';\n } else if (typeof value === 'symbol') {\n serialized[key] = value.toString();\n } else if (value === undefined) {\n serialized[key] = null;\n } else {\n serialized[key] = value;\n }\n } catch {\n serialized[key] = '[Unserializable]';\n }\n }\n\n return serialized;\n }\n}\n","/**\n * Text formatter for Logixia\n */\n\nimport type { ILogFormatter, LogEntry } from '../types';\nimport { LogLevel } from '../types';\n\nexport class TextFormatter implements ILogFormatter {\n private colorize: boolean;\n private includeTimestamp: boolean;\n private includeAppName: boolean;\n private includeTraceId: boolean;\n private includeContext: boolean;\n private timestampFormat: 'iso' | 'locale' | 'short';\n private colors: Record<string, string>;\n\n constructor(\n options: {\n colorize?: boolean;\n includeTimestamp?: boolean;\n includeAppName?: boolean;\n includeTraceId?: boolean;\n includeContext?: boolean;\n timestampFormat?: 'iso' | 'locale' | 'short';\n colors?: Record<string, string>;\n } = {}\n ) {\n this.colorize = options.colorize ?? true;\n this.includeTimestamp = options.includeTimestamp ?? true;\n this.includeAppName = options.includeAppName ?? true;\n this.includeTraceId = options.includeTraceId ?? true;\n this.includeContext = options.includeContext ?? true;\n this.timestampFormat = options.timestampFormat ?? 'locale';\n this.colors = {\n error: '\\x1b[31m', // Red\n warn: '\\x1b[33m', // Yellow\n info: '\\x1b[32m', // Green\n debug: '\\x1b[34m', // Blue\n trace: '\\x1b[35m', // Magenta\n verbose: '\\x1b[36m', // Cyan\n reset: '\\x1b[0m', // Reset\n bold: '\\x1b[1m', // Bold\n dim: '\\x1b[2m', // Dim\n ...options.colors,\n };\n }\n\n format(entry: LogEntry): string {\n const parts: string[] = [];\n\n // Add timestamp\n if (this.includeTimestamp) {\n const timestamp = this.formatTimestamp(entry.timestamp);\n parts.push(this.colorize ? `${this.colors.dim}${timestamp}${this.colors.reset}` : timestamp);\n }\n\n // Add log level\n const levelName = entry.level.toLowerCase();\n const levelColor = this.colors[levelName] || this.colors.reset;\n const formattedLevel = this.colorize\n ? `${levelColor}${this.colors.bold}${levelName.toUpperCase().padEnd(5)}${this.colors.reset}`\n : levelName.toUpperCase().padEnd(5);\n parts.push(`[${formattedLevel}]`);\n\n // Add app name\n if (this.includeAppName) {\n const appName = this.colorize\n ? `${this.colors.bold}${entry.appName}${this.colors.reset}`\n : entry.appName;\n parts.push(`[${appName}]`);\n }\n\n // Add trace ID\n if (this.includeTraceId && entry.traceId) {\n const traceId = this.colorize\n ? `${this.colors.dim}${entry.traceId}${this.colors.reset}`\n : entry.traceId;\n parts.push(`[${traceId}]`);\n }\n\n // Add context\n if (this.includeContext && entry.context) {\n const context = this.colorize\n ? `${this.colors.cyan}${entry.context}${this.colors.reset}`\n : entry.context;\n parts.push(`[${context}]`);\n }\n\n // Add message\n const message =\n this.colorize && entry.level === LogLevel.ERROR\n ? `${this.colors.error}${entry.message}${this.colors.reset}`\n : entry.message;\n parts.push(message);\n\n // Add payload\n if (entry.payload && Object.keys(entry.payload).length > 0) {\n const payload = this.formatPayload(entry.payload);\n if (payload) {\n parts.push(this.colorize ? `${this.colors.dim}${payload}${this.colors.reset}` : payload);\n }\n }\n\n return parts.join(' ');\n }\n\n private formatTimestamp(timestamp: string): string {\n const date = new Date(timestamp);\n\n switch (this.timestampFormat) {\n case 'iso':\n return date.toISOString();\n case 'short':\n return date.toLocaleTimeString();\n case 'locale':\n default:\n return date.toLocaleString();\n }\n }\n\n private formatPayload(payload: Record<string, unknown>): string {\n try {\n // Handle simple objects\n if (Object.keys(payload).length === 1) {\n const entry = Object.entries(payload)[0];\n if (entry) {\n const [key, value] = entry;\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return `${key}=${value}`;\n }\n }\n }\n\n // Handle multiple properties or complex objects\n const formatted = Object.entries(payload)\n .map(([key, value]) => {\n if (value === null || value === undefined) {\n return `${key}=${value}`;\n }\n if (typeof value === 'string') {\n return `${key}=\"${value}\"`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return `${key}=${value}`;\n }\n if (value instanceof Date) {\n return `${key}=${value.toISOString()}`;\n }\n if (typeof value === 'object') {\n return `${key}=${JSON.stringify(value)}`;\n }\n return `${key}=${String(value)}`;\n })\n .join(' ');\n\n return formatted;\n } catch {\n return JSON.stringify(payload);\n }\n }\n\n /**\n * Create a formatter with preset configurations\n */\n static createSimple(): TextFormatter {\n return new TextFormatter({\n colorize: true,\n includeTimestamp: true,\n includeAppName: false,\n includeTraceId: false,\n includeContext: true,\n timestampFormat: 'short',\n });\n }\n\n static createDetailed(): TextFormatter {\n return new TextFormatter({\n colorize: true,\n includeTimestamp: true,\n includeAppName: true,\n includeTraceId: true,\n includeContext: true,\n timestampFormat: 'locale',\n });\n }\n\n static createMinimal(): TextFormatter {\n return new TextFormatter({\n colorize: false,\n includeTimestamp: false,\n includeAppName: false,\n includeTraceId: false,\n includeContext: false,\n });\n }\n}\n","/**\n * Logixia - Advanced TypeScript Logger\n *\n * A comprehensive logging library with support for:\n * - Multiple output formats (console, file, JSON)\n * - Trace ID tracking\n * - Performance monitoring\n * - NestJS integration\n * - Customizable log levels and colors\n * - Intelligent log search and aggregation\n * - Natural language query processing\n * - Pattern recognition and anomaly detection\n */\n\nimport { createLogger as createLoggerFromCore, LogixiaLogger } from './core/logitron-logger';\nimport { LogixiaLoggerService } from './core/logitron-nestjs.service';\nimport type { Environment, LogColor, LoggerConfig } from './types';\nimport { LogLevel } from './types';\n\n// Type exports\nexport * from './core/logitron-logger.module';\nexport * from './core/logitron-nestjs.service';\nexport * from './formatters';\nexport * from './types';\nexport * from './utils/error.utils';\nexport { applyRedaction, redactObject } from './utils/redact.utils';\nexport * from './utils/shutdown.utils';\nexport * from './utils/trace.utils';\n\n// Search module exports\nexport * from './search';\n\n// Context propagation (AsyncLocalStorage)\nexport type { LogContext } from './context/async-context';\nexport {\n createExpressContextMiddleware,\n createFastifyContextHook,\n LogixiaContext,\n} from './context/async-context';\n\n// Sampling stats (SamplingConfig is already exported via ./types)\nexport type { SamplingStats } from './utils/sampling.utils';\n\n// Core exports\nexport { DEFAULT_CONFIG, LogixiaLogger, LogixiaLoggerService };\n\n/**\n * Default configuration for Logixia logger\n */\nconst DEFAULT_CONFIG = {\n appName: 'App',\n environment: 'development' as Environment,\n traceId: true,\n format: {\n timestamp: true,\n colorize: true,\n json: false,\n },\n silent: false,\n levelOptions: {\n level: LogLevel.INFO,\n levels: {\n [LogLevel.ERROR]: 0,\n [LogLevel.WARN]: 1,\n [LogLevel.INFO]: 2,\n [LogLevel.DEBUG]: 3,\n [LogLevel.TRACE]: 4,\n [LogLevel.VERBOSE]: 5,\n },\n colors: {\n [LogLevel.ERROR]: 'red',\n [LogLevel.WARN]: 'yellow',\n [LogLevel.INFO]: 'blue',\n [LogLevel.DEBUG]: 'green',\n [LogLevel.TRACE]: 'gray',\n [LogLevel.VERBOSE]: 'cyan',\n } as Record<string, LogColor>,\n },\n fields: {\n timestamp: true,\n level: true,\n appName: true,\n traceId: true,\n message: true,\n payload: true,\n timeTaken: true,\n },\n outputs: ['console'],\n};\n\n/**\n * Create a new Logixia logger instance with TypeScript support for custom levels\n * @param config - Logger configuration\n * @returns Typed logger instance\n */\nexport const createLogger = createLoggerFromCore;\n\n/**\n * Create a new Logixia logger service for NestJS\n * @param config - Logger configuration\n * @returns LogixiaLoggerService instance\n */\nexport function createLoggerService(config?: Partial<LoggerConfig>): LogixiaLoggerService {\n return new LogixiaLoggerService({ ...DEFAULT_CONFIG, ...config });\n}\n\n/**\n * Default logger instance\n */\nexport const logger = new LogixiaLogger(DEFAULT_CONFIG);\n\n/**\n * Export default configuration for reference\n */\n"],"mappings":"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"}
|
|
@@ -1,10 +1,79 @@
|
|
|
1
1
|
import { a as __toESM, t as __commonJS } from "./chunk-uEZWKkIX.mjs";
|
|
2
|
-
import { d as internalLog, f as internalWarn, t as TransportManager, u as internalError } from "./transport.manager-
|
|
2
|
+
import { d as internalLog, f as internalWarn, t as TransportManager, u as internalError } from "./transport.manager-5VVdqS3o.mjs";
|
|
3
3
|
import buildFastStringify from "fast-json-stringify";
|
|
4
4
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
5
|
-
import crypto from "crypto";
|
|
5
|
+
import crypto$1 from "crypto";
|
|
6
6
|
import { Injectable, Module, RequestMethod, Scope } from "@nestjs/common";
|
|
7
7
|
|
|
8
|
+
//#region src/context/async-context.ts
|
|
9
|
+
const _storage = new AsyncLocalStorage();
|
|
10
|
+
const LogixiaContext = {
|
|
11
|
+
run(store, callback) {
|
|
12
|
+
const parent = _storage.getStore() ?? {};
|
|
13
|
+
return _storage.run({
|
|
14
|
+
...parent,
|
|
15
|
+
...store
|
|
16
|
+
}, callback);
|
|
17
|
+
},
|
|
18
|
+
get() {
|
|
19
|
+
return _storage.getStore();
|
|
20
|
+
},
|
|
21
|
+
set(fields) {
|
|
22
|
+
const store = _storage.getStore();
|
|
23
|
+
if (!store) return;
|
|
24
|
+
Object.assign(store, fields);
|
|
25
|
+
},
|
|
26
|
+
getStorage() {
|
|
27
|
+
return _storage;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Create an Express/Connect-compatible middleware that wraps each request in
|
|
32
|
+
* a `LogixiaContext.run()` scope populated with common request fields.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* import { createExpressContextMiddleware } from 'logixia';
|
|
37
|
+
* app.use(createExpressContextMiddleware());
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
function createExpressContextMiddleware(options = {}) {
|
|
41
|
+
const { enrich, requestIdHeader = "x-request-id", traceIdHeader = "x-trace-id" } = options;
|
|
42
|
+
return function logixiaContextMiddleware(req, _res, next) {
|
|
43
|
+
const headers = req["headers"] ?? {};
|
|
44
|
+
const traceId = headers[traceIdHeader];
|
|
45
|
+
const base = {
|
|
46
|
+
requestId: headers[requestIdHeader] ?? crypto.randomUUID().slice(0, 8),
|
|
47
|
+
...traceId !== void 0 ? { traceId } : {}
|
|
48
|
+
};
|
|
49
|
+
LogixiaContext.run({
|
|
50
|
+
...base,
|
|
51
|
+
...enrich ? enrich(req) : {}
|
|
52
|
+
}, next);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create a Fastify lifecycle hook that wraps each request in a context scope.
|
|
57
|
+
*
|
|
58
|
+
* Register with `fastify.addHook('onRequest', createFastifyContextHook())`.
|
|
59
|
+
*/
|
|
60
|
+
function createFastifyContextHook(options = {}) {
|
|
61
|
+
const { enrich, requestIdHeader = "x-request-id", traceIdHeader = "x-trace-id" } = options;
|
|
62
|
+
return function logixiaFastifyHook(request, _reply, done) {
|
|
63
|
+
const headers = request["headers"] ?? {};
|
|
64
|
+
const traceId = headers[traceIdHeader];
|
|
65
|
+
const base = {
|
|
66
|
+
requestId: headers[requestIdHeader] ?? request["id"] ?? crypto.randomUUID().slice(0, 8),
|
|
67
|
+
...traceId !== void 0 ? { traceId } : {}
|
|
68
|
+
};
|
|
69
|
+
LogixiaContext.run({
|
|
70
|
+
...base,
|
|
71
|
+
...enrich ? enrich(request) : {}
|
|
72
|
+
}, done);
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
//#endregion
|
|
8
77
|
//#region src/types/index.ts
|
|
9
78
|
const LogLevel = {
|
|
10
79
|
ERROR: "error",
|
|
@@ -223,6 +292,137 @@ function isPlainObject(value) {
|
|
|
223
292
|
return value !== null && typeof value === "object" && !Array.isArray(value) && !(value instanceof Date) && !(value instanceof Error) && !(value instanceof RegExp);
|
|
224
293
|
}
|
|
225
294
|
|
|
295
|
+
//#endregion
|
|
296
|
+
//#region src/utils/sampling.utils.ts
|
|
297
|
+
const ALWAYS_EMIT_LEVELS = new Set(["error", "fatal"]);
|
|
298
|
+
var Sampler = class {
|
|
299
|
+
constructor(config, onStats) {
|
|
300
|
+
this.sampledTraces = /* @__PURE__ */ new Set();
|
|
301
|
+
this.droppedTraces = /* @__PURE__ */ new Set();
|
|
302
|
+
this._tokenBucket = 0;
|
|
303
|
+
this._lastRefillMs = Date.now();
|
|
304
|
+
this._stats = {
|
|
305
|
+
evaluated: 0,
|
|
306
|
+
emitted: 0,
|
|
307
|
+
dropped: 0,
|
|
308
|
+
byLevel: {},
|
|
309
|
+
windowStart: Date.now()
|
|
310
|
+
};
|
|
311
|
+
this.config = config;
|
|
312
|
+
if (config.maxLogsPerSecond && config.maxLogsPerSecond > 0) this._tokenBucket = config.maxLogsPerSecond;
|
|
313
|
+
const interval$1 = config.statsIntervalMs ?? 6e4;
|
|
314
|
+
if (interval$1 > 0 && onStats) {
|
|
315
|
+
this._statsTimer = setInterval(() => {
|
|
316
|
+
onStats(this.getStats());
|
|
317
|
+
this.resetStats();
|
|
318
|
+
}, interval$1);
|
|
319
|
+
if (this._statsTimer.unref) this._statsTimer.unref();
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Decide whether a given log entry should be emitted.
|
|
324
|
+
*
|
|
325
|
+
* @param level Log level string (lowercase)
|
|
326
|
+
* @param traceId Active trace ID, if any
|
|
327
|
+
* @returns true → emit, false → drop
|
|
328
|
+
*/
|
|
329
|
+
shouldEmit(level, traceId) {
|
|
330
|
+
var _this$config$perLevel;
|
|
331
|
+
const lvl = level.toLowerCase();
|
|
332
|
+
this._trackEvaluated(lvl);
|
|
333
|
+
if (ALWAYS_EMIT_LEVELS.has(lvl) && ((_this$config$perLevel = this.config.perLevel) === null || _this$config$perLevel === void 0 ? void 0 : _this$config$perLevel[lvl]) === void 0) {
|
|
334
|
+
this._trackEmitted(lvl);
|
|
335
|
+
return true;
|
|
336
|
+
}
|
|
337
|
+
if (this.config.traceConsistent && traceId) {
|
|
338
|
+
if (this.sampledTraces.has(traceId)) {
|
|
339
|
+
this._trackEmitted(lvl);
|
|
340
|
+
return true;
|
|
341
|
+
}
|
|
342
|
+
if (this.droppedTraces.has(traceId)) {
|
|
343
|
+
this._trackDropped(lvl);
|
|
344
|
+
return false;
|
|
345
|
+
}
|
|
346
|
+
const emit = this._sampleByRate(lvl);
|
|
347
|
+
if (emit) this.sampledTraces.add(traceId);
|
|
348
|
+
else this.droppedTraces.add(traceId);
|
|
349
|
+
if (emit) this._trackEmitted(lvl);
|
|
350
|
+
else this._trackDropped(lvl);
|
|
351
|
+
return emit;
|
|
352
|
+
}
|
|
353
|
+
if (!this._sampleByRate(lvl)) {
|
|
354
|
+
this._trackDropped(lvl);
|
|
355
|
+
return false;
|
|
356
|
+
}
|
|
357
|
+
if (this.config.maxLogsPerSecond && this.config.maxLogsPerSecond > 0) {
|
|
358
|
+
if (!this._consumeToken()) {
|
|
359
|
+
this._trackDropped(lvl);
|
|
360
|
+
return false;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
this._trackEmitted(lvl);
|
|
364
|
+
return true;
|
|
365
|
+
}
|
|
366
|
+
getStats() {
|
|
367
|
+
return {
|
|
368
|
+
...this._stats,
|
|
369
|
+
byLevel: { ...this._stats.byLevel }
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
resetStats() {
|
|
373
|
+
this._stats = {
|
|
374
|
+
evaluated: 0,
|
|
375
|
+
emitted: 0,
|
|
376
|
+
dropped: 0,
|
|
377
|
+
byLevel: {},
|
|
378
|
+
windowStart: Date.now()
|
|
379
|
+
};
|
|
380
|
+
this.sampledTraces.clear();
|
|
381
|
+
this.droppedTraces.clear();
|
|
382
|
+
}
|
|
383
|
+
destroy() {
|
|
384
|
+
if (this._statsTimer) clearInterval(this._statsTimer);
|
|
385
|
+
}
|
|
386
|
+
_sampleByRate(level) {
|
|
387
|
+
var _this$config$perLevel2, _this$config$perLevel3;
|
|
388
|
+
const rate = ((_this$config$perLevel2 = this.config.perLevel) === null || _this$config$perLevel2 === void 0 ? void 0 : _this$config$perLevel2[level]) ?? ((_this$config$perLevel3 = this.config.perLevel) === null || _this$config$perLevel3 === void 0 ? void 0 : _this$config$perLevel3["*"]) ?? this.config.rate ?? 1;
|
|
389
|
+
if (rate >= 1) return true;
|
|
390
|
+
if (rate <= 0) return false;
|
|
391
|
+
return Math.random() < rate;
|
|
392
|
+
}
|
|
393
|
+
_consumeToken() {
|
|
394
|
+
const now = Date.now();
|
|
395
|
+
const elapsed = (now - this._lastRefillMs) / 1e3;
|
|
396
|
+
const max$1 = this.config.maxLogsPerSecond;
|
|
397
|
+
this._tokenBucket = Math.min(max$1, this._tokenBucket + elapsed * max$1);
|
|
398
|
+
this._lastRefillMs = now;
|
|
399
|
+
if (this._tokenBucket >= 1) {
|
|
400
|
+
this._tokenBucket -= 1;
|
|
401
|
+
return true;
|
|
402
|
+
}
|
|
403
|
+
return false;
|
|
404
|
+
}
|
|
405
|
+
_ensure(level) {
|
|
406
|
+
if (!this._stats.byLevel[level]) this._stats.byLevel[level] = {
|
|
407
|
+
evaluated: 0,
|
|
408
|
+
emitted: 0
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
_trackEvaluated(level) {
|
|
412
|
+
this._stats.evaluated++;
|
|
413
|
+
this._ensure(level);
|
|
414
|
+
this._stats.byLevel[level].evaluated++;
|
|
415
|
+
}
|
|
416
|
+
_trackEmitted(level) {
|
|
417
|
+
this._stats.emitted++;
|
|
418
|
+
this._ensure(level);
|
|
419
|
+
this._stats.byLevel[level].emitted++;
|
|
420
|
+
}
|
|
421
|
+
_trackDropped(_level) {
|
|
422
|
+
this._stats.dropped++;
|
|
423
|
+
}
|
|
424
|
+
};
|
|
425
|
+
|
|
226
426
|
//#endregion
|
|
227
427
|
//#region src/utils/shutdown.utils.ts
|
|
228
428
|
/** Module-level registry of all logger instances that have opted into graceful shutdown */
|
|
@@ -286,7 +486,7 @@ const rnds8Pool = new Uint8Array(256);
|
|
|
286
486
|
let poolPtr = rnds8Pool.length;
|
|
287
487
|
function rng() {
|
|
288
488
|
if (poolPtr > rnds8Pool.length - 16) {
|
|
289
|
-
crypto.randomFillSync(rnds8Pool);
|
|
489
|
+
crypto$1.randomFillSync(rnds8Pool);
|
|
290
490
|
poolPtr = 0;
|
|
291
491
|
}
|
|
292
492
|
return rnds8Pool.slice(poolPtr, poolPtr += 16);
|
|
@@ -306,7 +506,7 @@ function unsafeStringify(arr, offset = 0) {
|
|
|
306
506
|
|
|
307
507
|
//#endregion
|
|
308
508
|
//#region node_modules/uuid/dist/esm-node/native.js
|
|
309
|
-
var native_default = { randomUUID: crypto.randomUUID };
|
|
509
|
+
var native_default = { randomUUID: crypto$1.randomUUID };
|
|
310
510
|
|
|
311
511
|
//#endregion
|
|
312
512
|
//#region node_modules/uuid/dist/esm-node/v4.js
|
|
@@ -544,6 +744,13 @@ var LogixiaLogger = class LogixiaLogger {
|
|
|
544
744
|
};
|
|
545
745
|
this.context = context$1 ?? "";
|
|
546
746
|
if (this.config.transports) this.transportManager = new TransportManager(this.config.transports);
|
|
747
|
+
if (this.config.sampling) this._sampler = new Sampler(this.config.sampling, (stats) => {
|
|
748
|
+
process.stdout.write(JSON.stringify({
|
|
749
|
+
level: "info",
|
|
750
|
+
message: "[logixia/sampling] stats",
|
|
751
|
+
...stats
|
|
752
|
+
}) + "\n");
|
|
753
|
+
});
|
|
547
754
|
this.setupGracefulShutdown();
|
|
548
755
|
this.createCustomLevelMethods();
|
|
549
756
|
this._buildPerfCaches();
|
|
@@ -783,6 +990,7 @@ var LogixiaLogger = class LogixiaLogger {
|
|
|
783
990
|
return this.transportManager.healthCheck();
|
|
784
991
|
}
|
|
785
992
|
async close() {
|
|
993
|
+
var _this$_sampler;
|
|
786
994
|
for (const [label, timer$1] of this.timers) await this.warn(`Timer '${label}' was not ended properly`, {
|
|
787
995
|
startTime: new Date(timer$1.startTime).toISOString(),
|
|
788
996
|
duration: `${Date.now() - timer$1.startTime}ms (incomplete)`
|
|
@@ -792,15 +1000,25 @@ var LogixiaLogger = class LogixiaLogger {
|
|
|
792
1000
|
await this.transportManager.flush();
|
|
793
1001
|
await this.transportManager.close();
|
|
794
1002
|
}
|
|
1003
|
+
(_this$_sampler = this._sampler) === null || _this$_sampler === void 0 || _this$_sampler.destroy();
|
|
795
1004
|
deregisterFromShutdown(this);
|
|
796
1005
|
}
|
|
797
1006
|
async log(level, message, data) {
|
|
798
1007
|
if (this.config.silent) return;
|
|
799
1008
|
if (!this.shouldLog(level)) return;
|
|
800
|
-
|
|
801
|
-
|
|
1009
|
+
if (this._sampler) {
|
|
1010
|
+
const traceId$1 = this.config.traceId ? getCurrentTraceId() ?? this.fallbackTraceId : void 0;
|
|
1011
|
+
if (!this._sampler.shouldEmit(level, traceId$1)) return;
|
|
1012
|
+
}
|
|
1013
|
+
const alsContext = LogixiaContext.get();
|
|
1014
|
+
const mergedData = alsContext && Object.keys(alsContext).length > 0 ? {
|
|
1015
|
+
...alsContext,
|
|
802
1016
|
...data
|
|
803
1017
|
} : data;
|
|
1018
|
+
const rawPayload = this._hasContextData ? {
|
|
1019
|
+
...this.contextData,
|
|
1020
|
+
...mergedData
|
|
1021
|
+
} : mergedData;
|
|
804
1022
|
let payload;
|
|
805
1023
|
if (rawPayload !== void 0 && rawPayload !== null) payload = this._hasRedact ? applyRedaction(rawPayload, this.config.redact) ?? rawPayload : rawPayload;
|
|
806
1024
|
const traceId = this.config.traceId ? getCurrentTraceId() ?? this.fallbackTraceId : void 0;
|
|
@@ -10303,5 +10521,5 @@ let LogixiaLoggerModule = class LogixiaLoggerModule$1 {
|
|
|
10303
10521
|
LogixiaLoggerModule = _LogixiaLoggerModule = __decorate([Module({})], LogixiaLoggerModule);
|
|
10304
10522
|
|
|
10305
10523
|
//#endregion
|
|
10306
|
-
export { redactObject as C, DEFAULT_LOG_COLORS as D, serializeError as E, DEFAULT_LOG_LEVELS as O, applyRedaction as S, normalizeError as T, traceStorage as _, TraceMiddleware as a, registerForShutdown as b, LogixiaLogger as c, createTraceMiddleware as d, extractTraceId as f, setTraceId as g, runWithTraceId as h, WebSocketTraceInterceptor as i, LogLevel as k, createLogger as l, getCurrentTraceId as m, LOGIXIA_LOGGER_PREFIX as n, KafkaTraceInterceptor as o, generateTraceId as p, LogixiaLoggerModule as r, LogixiaLoggerService as s, LOGIXIA_LOGGER_CONFIG as t, DEFAULT_TRACE_HEADERS$1 as u, deregisterFromShutdown as v, isError as w, resetShutdownHandlers as x, flushOnExit as y };
|
|
10307
|
-
//# sourceMappingURL=logitron-logger.module-
|
|
10524
|
+
export { LogixiaContext as A, redactObject as C, DEFAULT_LOG_COLORS as D, serializeError as E, createFastifyContextHook as M, DEFAULT_LOG_LEVELS as O, applyRedaction as S, normalizeError as T, traceStorage as _, TraceMiddleware as a, registerForShutdown as b, LogixiaLogger as c, createTraceMiddleware as d, extractTraceId as f, setTraceId as g, runWithTraceId as h, WebSocketTraceInterceptor as i, createExpressContextMiddleware as j, LogLevel as k, createLogger as l, getCurrentTraceId as m, LOGIXIA_LOGGER_PREFIX as n, KafkaTraceInterceptor as o, generateTraceId as p, LogixiaLoggerModule as r, LogixiaLoggerService as s, LOGIXIA_LOGGER_CONFIG as t, DEFAULT_TRACE_HEADERS$1 as u, deregisterFromShutdown as v, isError as w, resetShutdownHandlers as x, flushOnExit as y };
|
|
10525
|
+
//# sourceMappingURL=logitron-logger.module-2AzkadqZ.mjs.map
|