export enum LogLevel {
DEBUG = 0,
INFO = 1,
WARN = 2,
ERROR = 3,
}
export interface LoggerOptions {
level: LogLevel;
prefix?: string;
}
export interface Logger {
debug(message: string, meta?: Record<string, unknown>): void;
info(message: string, meta?: Record<string, unknown>): void;
warn(message: string, meta?: Record<string, unknown>): void;
error(message: string, meta?: Record<string, unknown>): void;
setLevel(level: LogLevel): void;
}
export class ConsoleLogger implements Logger {
private level: LogLevel;
private prefix: string;
constructor(options: LoggerOptions) {
this.level = options.level;
this.prefix = options.prefix || 'MCPRouter';
}
private formatMessage(
level: string,
message: string,
meta?: Record<string, unknown>,
): string {
const timestamp = new Date().toISOString();
const baseMessage = `[${timestamp}] [${this.prefix}] [${level}] ${message}`;
return meta ? `${baseMessage} ${JSON.stringify(meta)}` : baseMessage;
}
debug(message: string, meta?: Record<string, unknown>): void {
if (this.level <= LogLevel.DEBUG) {
console.debug(this.formatMessage('DEBUG', message, meta));
}
}
info(message: string, meta?: Record<string, unknown>): void {
if (this.level <= LogLevel.INFO) {
console.info(this.formatMessage('INFO', message, meta));
}
}
warn(message: string, meta?: Record<string, unknown>): void {
if (this.level <= LogLevel.WARN) {
console.warn(this.formatMessage('WARN', message, meta));
}
}
error(message: string, meta?: Record<string, unknown>): void {
if (this.level <= LogLevel.ERROR) {
console.error(this.formatMessage('ERROR', message, meta));
}
}
setLevel(level: LogLevel): void {
this.level = level;
}
}