/**
* Logger utility for the MCP Interface Validator
*/
export enum LogLevel {
DEBUG = 0,
INFO = 1,
WARN = 2,
ERROR = 3
}
export interface LogEntry {
timestamp: string;
level: LogLevel;
component: string;
message: string;
data?: any;
}
export interface LoggerConfig {
level: LogLevel;
enableConsole: boolean;
enableFile: boolean;
maxLogEntries: number;
}
/**
* Logger class for structured logging
*/
export class Logger {
private component: string;
private config: LoggerConfig;
private logEntries: LogEntry[] = [];
constructor(component: string, config: Partial<LoggerConfig> = {}) {
this.component = component;
this.config = {
level: LogLevel.INFO,
enableConsole: true,
enableFile: false,
maxLogEntries: 1000,
...config
};
}
/**
* Log a debug message
*/
debug(message: string, data?: any): void {
this.log(LogLevel.DEBUG, message, data);
}
/**
* Log an info message
*/
info(message: string, data?: any): void {
this.log(LogLevel.INFO, message, data);
}
/**
* Log a warning message
*/
warn(message: string, data?: any): void {
this.log(LogLevel.WARN, message, data);
}
/**
* Log an error message
*/
error(message: string, error?: any): void {
this.log(LogLevel.ERROR, message, error);
}
/**
* Core logging method
*/
private log(level: LogLevel, message: string, data?: any): void {
if (level < this.config.level) {
return;
}
const entry: LogEntry = {
timestamp: new Date().toISOString(),
level,
component: this.component,
message,
data
};
// Add to log entries
this.logEntries.push(entry);
// Maintain max log entries
if (this.logEntries.length > this.config.maxLogEntries) {
this.logEntries.shift();
}
// Console output
if (this.config.enableConsole) {
this.outputToConsole(entry);
}
}
/**
* Output log entry to console
*/
private outputToConsole(entry: LogEntry): void {
const levelName = LogLevel[entry.level];
const prefix = `[${entry.timestamp}] [${levelName}] [${entry.component}]`;
const message = `${prefix} ${entry.message}`;
switch (entry.level) {
case LogLevel.DEBUG:
console.debug(message, entry.data || '');
break;
case LogLevel.INFO:
console.info(message, entry.data || '');
break;
case LogLevel.WARN:
console.warn(message, entry.data || '');
break;
case LogLevel.ERROR:
console.error(message, entry.data || '');
break;
}
}
/**
* Get recent log entries
*/
getLogEntries(count?: number): LogEntry[] {
if (count) {
return this.logEntries.slice(-count);
}
return [...this.logEntries];
}
/**
* Clear log entries
*/
clearLogs(): void {
this.logEntries = [];
}
/**
* Update logger configuration
*/
updateConfig(config: Partial<LoggerConfig>): void {
this.config = { ...this.config, ...config };
}
/**
* Get current configuration
*/
getConfig(): LoggerConfig {
return { ...this.config };
}
}
/**
* Global logger instance
*/
export const globalLogger = new Logger('Global');
export default Logger;