/**
* Logging utility with different log levels
*/
export enum LogLevel {
DEBUG = 'DEBUG',
INFO = 'INFO',
WARN = 'WARN',
ERROR = 'ERROR'
}
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, data?: any): string {
const timestamp = new Date().toISOString();
let logMessage = `[${timestamp}] [${level}] ${message}`;
if (data) {
logMessage += ` ${JSON.stringify(data)}`;
}
return logMessage;
}
debug(message: string, data?: any): void {
if (this.shouldLog(LogLevel.DEBUG)) {
console.debug(this.formatMessage(LogLevel.DEBUG, message, data));
}
}
info(message: string, data?: any): void {
if (this.shouldLog(LogLevel.INFO)) {
console.info(this.formatMessage(LogLevel.INFO, message, data));
}
}
warn(message: string, data?: any): void {
if (this.shouldLog(LogLevel.WARN)) {
console.warn(this.formatMessage(LogLevel.WARN, message, data));
}
}
error(message: string, error?: any): void {
if (this.shouldLog(LogLevel.ERROR)) {
const errorData = error instanceof Error ? {
message: error.message,
stack: error.stack
} : error;
console.error(this.formatMessage(LogLevel.ERROR, message, errorData));
}
}
}
export const logger = new Logger(
process.env.LOG_LEVEL as LogLevel || LogLevel.INFO
);