/** * @file Enterprise Logging Extension * @description Comprehensive logging system for React applications with enterprise-grade features * * @version 2.0.0 * @author Enzyme Team * @license MIT * * ## Features * * 1. **Structured Logging** - Six log levels (trace, debug, info, warn, error, fatal) * 2. **Operation Tracking** - Track React lifecycle, API calls, state changes * 3. **Context Injection** - Automatic correlationId, userId, sessionId, requestId * 4. **Log Formatters** - JSON, human-readable, browser console with colors * 5. **Transport System** - Console, localStorage, remote endpoint, custom transports * 6. **Log Buffering** - Batch logs for performance with configurable flush intervals * 7. **Log Filtering** - Filter by level, category, pattern, or custom predicate * 8. **Performance Metrics** - Automatic timing of operations with thresholds * 9. **Breadcrumbs** - Track user actions for debugging (last N actions) * 10. **Sensitive Data Masking** - Automatic PII masking for compliance * * @example Basic Usage * ```typescript * import { loggingExtension } from '@defendr/enzyme/extensions/built-in'; * * // In your app initialization * const logger = loggingExtension.initialize({ * level: 'info', * enableBreadcrumbs: true, * bufferSize: 100, * flushInterval: 5000, * }); * * // Use client methods * logger.$log('info', 'User logged in', { userId: '123' }); * logger.$startOperation('fetchUserData'); * // ... async operation * logger.$endOperation('fetchUserData'); * logger.$addBreadcrumb({ type: 'navigation', message: 'User navigated to /dashboard' }); * ``` * * @example With React * ```typescript * import { useLogger } from '@defendr/enzyme/extensions/built-in'; * * function MyComponent() { * const logger = useLogger(); * * useEffect(() => { * const op = logger.$startOperation('componentMount'); * // ... initialization * logger.$endOperation(op); * }, []); * * return
My Component
; * } * ``` * * @example Remote Logging * ```typescript * logger.addTransport({ * name: 'remote', * async write(entries) { * await fetch('/api/logs', { * method: 'POST', * headers: { 'Content-Type': 'application/json' }, * body: JSON.stringify(entries), * }); * }, * }); * ``` */ /** * Log levels in order of severity */ export declare enum LogLevel { TRACE = 0, DEBUG = 1, INFO = 2, WARN = 3, ERROR = 4, FATAL = 5 } /** * Log level names for human readability */ export type LogLevelName = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal'; /** * Map log level names to enum values */ export declare const LOG_LEVEL_MAP: Record; /** * Operation category for tracking */ export type OperationCategory = 'lifecycle' | 'api' | 'state' | 'navigation' | 'user-action' | 'render' | 'custom'; /** * Breadcrumb type for user action tracking */ export interface Breadcrumb { /** Timestamp when breadcrumb was created */ timestamp: number; /** Type of action */ type: 'navigation' | 'user-action' | 'api' | 'state-change' | 'error' | 'custom'; /** Human-readable message */ message: string; /** Additional metadata */ data?: Record; /** Severity level */ level?: LogLevelName; } /** * Log context for correlation and debugging */ export interface LogContext { /** Correlation ID for tracking requests across services */ correlationId?: string; /** User ID for user-specific logs */ userId?: string; /** Session ID for session tracking */ sessionId?: string; /** Request ID for tracking individual requests */ requestId?: string; /** Component name for React component logs */ component?: string; /** Additional custom context */ [key: string]: unknown; } /** * Log entry structure */ export interface LogEntry { /** Unique log entry ID */ id: string; /** Timestamp in milliseconds */ timestamp: number; /** ISO 8601 timestamp string */ timestampISO: string; /** Log level */ level: LogLevel; /** Log level name */ levelName: LogLevelName; /** Log message */ message: string; /** Log context */ context: LogContext; /** Additional metadata */ metadata?: Record; /** Error object if applicable */ error?: Error; /** Stack trace if error */ stack?: string; /** Operation name if tracking operation */ operation?: string; /** Operation category */ category?: OperationCategory; /** Operation duration in ms */ duration?: number; } /** * Operation tracking info */ export interface OperationInfo { /** Operation name */ name: string; /** Operation category */ category: OperationCategory; /** Start time */ startTime: number; /** Context at operation start */ context: LogContext; /** Additional metadata */ metadata?: Record; } /** * Log formatter function */ export type LogFormatter = (entry: LogEntry) => string; /** * Log transport for sending logs to different destinations */ export interface LogTransport { /** Transport name */ name: string; /** Minimum log level for this transport */ level?: LogLevel; /** Write log entries */ write: (entries: LogEntry[]) => Promise | void; /** Flush any buffered logs */ flush?: () => Promise | void; /** Transport-specific formatter */ formatter?: LogFormatter; } /** * Log filter predicate */ export type LogFilter = (entry: LogEntry) => boolean; /** * Logger configuration */ export interface LoggerConfig { /** Minimum log level to capture */ level?: LogLevelName; /** Enable breadcrumb tracking */ enableBreadcrumbs?: boolean; /** Maximum breadcrumbs to keep */ maxBreadcrumbs?: number; /** Buffer size before auto-flush */ bufferSize?: number; /** Auto-flush interval in milliseconds */ flushInterval?: number; /** Enable sensitive data masking */ enableMasking?: boolean; /** Custom masking patterns */ maskPatterns?: RegExp[]; /** Global log context */ context?: LogContext; /** Custom log formatters */ formatters?: Record; /** Initial transports */ transports?: LogTransport[]; /** Custom filters */ filters?: LogFilter[]; /** Enable performance tracking */ enablePerformanceTracking?: boolean; /** Slow operation threshold in ms */ slowOperationThreshold?: number; } /** * Performance metrics */ export interface PerformanceMetrics { /** Total operations tracked */ totalOperations: number; /** Average operation duration */ averageDuration: number; /** Slowest operations */ slowestOperations: Array<{ name: string; duration: number; timestamp: number; }>; /** Operations by category */ operationsByCategory: Record; } /** * Logger instance interface */ export interface Logger { /** Log a message at specified level */ $log(level: LogLevelName, message: string, context?: Record): void; /** Log trace message */ $trace(message: string, context?: Record): void; /** Log debug message */ $debug(message: string, context?: Record): void; /** Log info message */ $info(message: string, context?: Record): void; /** Log warning message */ $warn(message: string, context?: Record): void; /** Log error message */ $error(message: string, error?: Error, context?: Record): void; /** Log fatal message */ $fatal(message: string, error?: Error, context?: Record): void; /** Start tracking an operation */ $startOperation(name: string, category?: OperationCategory, metadata?: Record): string; /** End tracking an operation */ $endOperation(operationId: string): void; /** Add a breadcrumb */ $addBreadcrumb(breadcrumb: Omit): void; /** Get breadcrumb history */ $getBreadcrumbs(): Breadcrumb[]; /** Get log history */ $getLogHistory(options?: { level?: LogLevelName; limit?: number; offset?: number; category?: OperationCategory; }): LogEntry[]; /** Set log level dynamically */ $setLogLevel(level: LogLevelName): void; /** Flush buffered logs */ $flushLogs(): Promise; /** Add a transport */ $addTransport(transport: LogTransport): void; /** Remove a transport */ $removeTransport(name: string): boolean; /** Add a filter */ $addFilter(filter: LogFilter): void; /** Clear filters */ $clearFilters(): void; /** Update global context */ $updateContext(context: Partial): void; /** Get performance metrics */ $getMetrics(): PerformanceMetrics; /** Clear all logs and metrics */ $clear(): void; } /** * Generate correlation ID */ declare function generateCorrelationId(): string; /** * Mask sensitive data in a string */ declare function maskSensitiveData(text: string, patterns?: RegExp[]): string; /** * Deep mask sensitive data in objects */ declare function maskObject(obj: unknown, patterns?: RegExp[]): unknown; /** * JSON formatter for structured logging */ export declare const jsonFormatter: LogFormatter; /** * Human-readable formatter */ export declare const humanFormatter: LogFormatter; /** * Browser console formatter with colors */ export declare const consoleFormatter: LogFormatter; /** * Compact formatter for production */ export declare const compactFormatter: LogFormatter; /** * Console transport with color support */ export declare const consoleTransport: LogTransport; /** * LocalStorage transport for persistence */ export declare const localStorageTransport: LogTransport; /** * Remote transport for sending logs to a server */ export declare function createRemoteTransport(endpoint: string, options?: { headers?: Record; batchSize?: number; }): LogTransport; /** * Create a logger instance */ export declare function createLogger(config?: LoggerConfig): Logger; /** * Initialize global logger * * @example * ```typescript * import { initializeLogger } from '@defendr/enzyme/extensions/built-in'; * * initializeLogger({ * level: 'info', * enableBreadcrumbs: true, * transports: [consoleTransport, localStorageTransport], * }); * ``` */ export declare function initializeLogger(config?: LoggerConfig): Logger; /** * Get global logger instance * * @example * ```typescript * import { getLogger } from '@defendr/enzyme/extensions/built-in'; * * const logger = getLogger(); * logger.$info('Application started'); * ``` */ export declare function getLogger(): Logger; /** * React hook for using logger * * @example * ```typescript * import { useLogger } from '@defendr/enzyme/extensions/built-in'; * * function MyComponent() { * const logger = useLogger(); * * useEffect(() => { * logger.$info('Component mounted'); * return () => logger.$info('Component unmounted'); * }, []); * * return
My Component
; * } * ``` */ export declare function useLogger(): Logger; /** * Enzyme logging extension * * This extension provides comprehensive logging capabilities for React applications. * * @example * ```typescript * import { loggingExtension } from '@defendr/enzyme/extensions/built-in'; * import { Enzyme } from '@defendr/enzyme/cli'; * * const enzyme = new Enzyme().$extends(loggingExtension); * ``` */ export declare const loggingExtension: { name: string; version: string; description: string; /** * Initialize the extension */ initialize(config?: LoggerConfig): Logger; /** * Get logger instance */ getLogger: typeof getLogger; /** * Create a new logger instance */ createLogger: typeof createLogger; /** * React hook */ useLogger: typeof useLogger; /** * Formatters */ formatters: { json: LogFormatter; human: LogFormatter; console: LogFormatter; compact: LogFormatter; }; /** * Transports */ transports: { console: LogTransport; localStorage: LogTransport; createRemote: typeof createRemoteTransport; }; /** * Utilities */ utils: { maskSensitiveData: typeof maskSensitiveData; maskObject: typeof maskObject; generateCorrelationId: typeof generateCorrelationId; }; }; export default loggingExtension;