logger.ts•1.7 kB
/**
* Structured logging utility
* Uses console.error since stdout is reserved for MCP protocol
*/
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
export class Logger {
private level: LogLevel;
private prefix: string;
constructor(prefix: string = 'MCP', level: LogLevel = 'info') {
this.prefix = prefix;
this.level = level;
}
private shouldLog(level: LogLevel): boolean {
const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];
const currentLevelIndex = levels.indexOf(this.level);
const requestedLevelIndex = levels.indexOf(level);
return requestedLevelIndex >= currentLevelIndex;
}
private formatMessage(level: LogLevel, message: string, meta?: any): string {
const timestamp = new Date().toISOString();
const metaStr = meta ? ` ${JSON.stringify(meta)}` : '';
return `[${timestamp}] [${this.prefix}] [${level.toUpperCase()}] ${message}${metaStr}`;
}
debug(message: string, meta?: any): void {
if (this.shouldLog('debug')) {
console.error(this.formatMessage('debug', message, meta));
}
}
info(message: string, meta?: any): void {
if (this.shouldLog('info')) {
console.error(this.formatMessage('info', message, meta));
}
}
warn(message: string, meta?: any): void {
if (this.shouldLog('warn')) {
console.error(this.formatMessage('warn', message, meta));
}
}
error(message: string, meta?: any): void {
if (this.shouldLog('error')) {
console.error(this.formatMessage('error', message, meta));
}
}
setLevel(level: LogLevel): void {
this.level = level;
}
}
// Export singleton instance
export const logger = new Logger('PrimeNG-MCP', 'info');