UNPKG

@sailboat-computer/event-bus

Version:

Standardized event bus for sailboat computer v3 with resilience features and offline capabilities

162 lines (142 loc) 3.38 kB
/** * Simple logger for the event bus */ /** * Log levels */ export enum LogLevel { DEBUG = 'debug', INFO = 'info', WARN = 'warn', ERROR = 'error' } /** * Logger configuration */ export interface LoggerConfig { /** * Minimum log level to output */ level: LogLevel; /** * Service name to include in logs */ serviceName: string; /** * Whether to include timestamps in logs */ includeTimestamps: boolean; } /** * Default logger configuration */ const DEFAULT_CONFIG: LoggerConfig = { level: LogLevel.INFO, serviceName: 'event-bus', includeTimestamps: true }; /** * Simple logger for the event bus */ export class Logger { private config: LoggerConfig; /** * Create a new logger * * @param config - Logger configuration */ constructor(config: Partial<LoggerConfig> = {}) { this.config = { ...DEFAULT_CONFIG, ...config }; } /** * Log a debug message * * @param message - Message to log * @param data - Additional data to log */ debug(message: string, data?: any): void { this.log(LogLevel.DEBUG, message, data); } /** * Log an info message * * @param message - Message to log * @param data - Additional data to log */ info(message: string, data?: any): void { this.log(LogLevel.INFO, message, data); } /** * Log a warning message * * @param message - Message to log * @param data - Additional data to log */ warn(message: string, data?: any): void { this.log(LogLevel.WARN, message, data); } /** * Log an error message * * @param message - Message to log * @param error - Error to log * @param data - Additional data to log */ error(message: string, error?: Error, data?: any): void { const errorData = error ? { name: error.name, message: error.message, stack: error.stack, ...data } : data; this.log(LogLevel.ERROR, message, errorData); } /** * Log a message * * @param level - Log level * @param message - Message to log * @param data - Additional data to log */ private log(level: LogLevel, message: string, data?: any): void { // Skip if level is below configured level if (!this.shouldLog(level)) { return; } const timestamp = this.config.includeTimestamps ? new Date().toISOString() : ''; const prefix = `[${timestamp}] [${this.config.serviceName}] [${level.toUpperCase()}]`; if (data) { console.log(`${prefix} ${message}`, data); } else { console.log(`${prefix} ${message}`); } } /** * Check if a log level should be logged * * @param level - Log level to check * @returns Whether the log level should be logged */ private shouldLog(level: LogLevel): boolean { const levels = [LogLevel.DEBUG, LogLevel.INFO, LogLevel.WARN, LogLevel.ERROR]; const configLevelIndex = levels.indexOf(this.config.level); const logLevelIndex = levels.indexOf(level); return logLevelIndex >= configLevelIndex; } } /** * Create a new logger * * @param config - Logger configuration * @returns Logger instance */ export function createLogger(config: Partial<LoggerConfig> = {}): Logger { return new Logger(config); } /** * Default logger instance */ export const logger = createLogger();