@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
text/typescript
/**
* 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();