import { CONFIG } from './config.js';
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
const LOG_LEVELS: Record<LogLevel, number> = {
debug: 0,
info: 1,
warn: 2,
error: 3,
};
class Logger {
private level: LogLevel;
constructor(level: LogLevel = 'info') {
console.log('[LOGGER] Initializing logger...');
this.level = level;
console.log('[LOGGER] Logger initialized:', {
configuredLevel: level,
numericLevel: LOG_LEVELS[level],
availableLevels: Object.keys(LOG_LEVELS),
timestamp: new Date().toISOString()
});
}
private shouldLog(level: LogLevel): boolean {
return LOG_LEVELS[level] >= LOG_LEVELS[this.level];
}
private formatMessage(level: LogLevel, message: string, ...args: any[]): string {
const timestamp = new Date().toISOString();
const prefix = `[${timestamp}] [${level.toUpperCase()}] [todo-mcp]`;
if (args.length > 0) {
return `${prefix} ${message} ${args.map(arg =>
typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg)
).join(' ')}`;
}
return `${prefix} ${message}`;
}
debug(message: string, ...args: any[]): void {
if (this.shouldLog('debug')) {
console.debug(this.formatMessage('debug', message, ...args));
}
}
info(message: string, ...args: any[]): void {
if (this.shouldLog('info')) {
console.info(this.formatMessage('info', message, ...args));
}
}
warn(message: string, ...args: any[]): void {
if (this.shouldLog('warn')) {
console.warn(this.formatMessage('warn', message, ...args));
}
}
error(message: string, ...args: any[]): void {
if (this.shouldLog('error')) {
console.error(this.formatMessage('error', message, ...args));
}
}
setLevel(level: LogLevel): void {
this.level = level;
}
}
export const logger = new Logger(CONFIG.logLevel);