// Copyright 2025 Chris Bunting
// Brief: Logger utility for Static Analysis MCP Server
// Scope: Provides logging functionality with different levels
import { LogLevel } from '@mcp-code-analysis/shared-types';
export class Logger {
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)) {
process.stderr.write(this.formatMessage(LogLevel.DEBUG, message, ...args) + '\n');
}
}
info(message: string, ...args: any[]): void {
if (this.shouldLog(LogLevel.INFO)) {
process.stderr.write(this.formatMessage(LogLevel.INFO, message, ...args) + '\n');
}
}
warn(message: string, ...args: any[]): void {
if (this.shouldLog(LogLevel.WARN)) {
process.stderr.write(this.formatMessage(LogLevel.WARN, message, ...args) + '\n');
}
}
error(message: string, ...args: any[]): void {
if (this.shouldLog(LogLevel.ERROR)) {
process.stderr.write(this.formatMessage(LogLevel.ERROR, message, ...args) + '\n');
}
}
setLogLevel(level: LogLevel): void {
this.logLevel = level;
}
getLogLevel(): LogLevel {
return this.logLevel;
}
}