// Copyright 2025 Chris Bunting
// Brief: Logger utility for dependency analysis server
// Scope: Provides logging functionality with different levels
import { LoggerInterface, LogLevel } from '@mcp-code-analysis/shared-types';
export class Logger implements LoggerInterface {
private logLevel: LogLevel;
constructor(logLevel: LogLevel = LogLevel.INFO) {
this.logLevel = logLevel;
}
private shouldLog(level: LogLevel): boolean {
const levels = [LogLevel.DEBUG, LogLevel.INFO, LogLevel.WARN, LogLevel.ERROR];
return levels.indexOf(level) >= levels.indexOf(this.logLevel);
}
private formatMessage(level: LogLevel, message: string, ...args: any[]): string {
const timestamp = new Date().toISOString();
const formattedArgs = args.length > 0 ? ` ${args.map(arg => JSON.stringify(arg)).join(' ')}` : '';
return `[${timestamp}] ${level.toUpperCase()}: ${message}${formattedArgs}`;
}
debug(message: string, ...args: any[]): void {
if (this.shouldLog(LogLevel.DEBUG)) {
console.error(this.formatMessage(LogLevel.DEBUG, message, ...args));
}
}
info(message: string, ...args: any[]): void {
if (this.shouldLog(LogLevel.INFO)) {
console.log(this.formatMessage(LogLevel.INFO, message, ...args));
}
}
warn(message: string, ...args: any[]): void {
if (this.shouldLog(LogLevel.WARN)) {
console.warn(this.formatMessage(LogLevel.WARN, message, ...args));
}
}
error(message: string, ...args: any[]): void {
if (this.shouldLog(LogLevel.ERROR)) {
console.error(this.formatMessage(LogLevel.ERROR, message, ...args));
}
}
setLogLevel(level: LogLevel): void {
this.logLevel = level;
}
}