/**
* 日志级别枚举
*/
export enum LogLevel {
DEBUG = 0,
INFO = 1,
WARN = 2,
ERROR = 3,
}
/**
* 日志工具类
*/
class Logger {
private level: LogLevel;
constructor() {
const envLevel = process.env.LOG_LEVEL?.toUpperCase();
this.level =
envLevel === 'DEBUG'
? LogLevel.DEBUG
: envLevel === 'INFO'
? LogLevel.INFO
: envLevel === 'WARN'
? LogLevel.WARN
: envLevel === 'ERROR'
? LogLevel.ERROR
: LogLevel.INFO; // 默认 INFO 级别
}
/**
* 格式化日志消息
*/
private formatMessage(level: string, message: string, ...args: unknown[]): string {
const timestamp = new Date().toISOString();
const argsStr = args.length > 0 ? ` ${JSON.stringify(args)}` : '';
return `[${timestamp}] [${level}] ${message}${argsStr}`;
}
/**
* Debug 级别日志
*/
debug(message: string, ...args: unknown[]): void {
if (this.level <= LogLevel.DEBUG) {
console.error(this.formatMessage('DEBUG', message, ...args));
}
}
/**
* Info 级别日志
*/
info(message: string, ...args: unknown[]): void {
if (this.level <= LogLevel.INFO) {
console.error(this.formatMessage('INFO', message, ...args));
}
}
/**
* Warn 级别日志
*/
warn(message: string, ...args: unknown[]): void {
if (this.level <= LogLevel.WARN) {
console.error(this.formatMessage('WARN', message, ...args));
}
}
/**
* Error 级别日志
*/
error(message: string, error?: unknown, ...args: unknown[]): void {
if (this.level <= LogLevel.ERROR) {
const errorInfo =
error instanceof Error
? ` ${error.message}${error.stack ? `\n${error.stack}` : ''}`
: error
? ` ${JSON.stringify(error)}`
: '';
console.error(this.formatMessage('ERROR', message, ...args) + errorInfo);
}
}
}
/**
* 导出单例日志实例
*/
export const logger = new Logger();