/**
* Logger Utility for MCP Interface Validator
*
* Provides structured logging with different levels and formatting
*/
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 class Logger {
private component: string;
private logLevel: LogLevel;
constructor(component: string, logLevel: LogLevel = LogLevel.INFO) {
this.component = component;
this.logLevel = logLevel;
}
/**
* Log debug message
*/
debug(message: string, data?: any): void {
this.log(LogLevel.DEBUG, message, data);
}
/**
* Log info message
*/
info(message: string, data?: any): void {
this.log(LogLevel.INFO, message, data);
}
/**
* Log warning message
*/
warn(message: string, data?: any): void {
this.log(LogLevel.WARN, message, data);
}
/**
* Log error message
*/
error(message: string, error?: any): void {
this.log(LogLevel.ERROR, message, error);
}
/**
* Internal logging method
*/
private log(level: LogLevel, message: string, data?: any): void {
if (level < this.logLevel) {
return;
}
const entry: LogEntry = {
timestamp: new Date().toISOString(),
level,
component: this.component,
message,
data
};
const formattedMessage = this.formatLogEntry(entry);
switch (level) {
case LogLevel.DEBUG:
console.debug(formattedMessage);
break;
case LogLevel.INFO:
console.info(formattedMessage);
break;
case LogLevel.WARN:
console.warn(formattedMessage);
break;
case LogLevel.ERROR:
console.error(formattedMessage);
break;
}
}
/**
* Format log entry for output
*/
private formatLogEntry(entry: LogEntry): string {
const levelName = LogLevel[entry.level];
let formatted = `[${entry.timestamp}] ${levelName} [${entry.component}] ${entry.message}`;
if (entry.data) {
formatted += `\n${JSON.stringify(entry.data, null, 2)}`;
}
return formatted;
}
/**
* Set log level
*/
setLogLevel(level: LogLevel): void {
this.logLevel = level;
}
/**
* Get current log level
*/
getLogLevel(): LogLevel {
return this.logLevel;
}
}