All checks were successful
deploy to server / build-and-deploy (push) Successful in 3m15s
111 lines
2.5 KiB
TypeScript
111 lines
2.5 KiB
TypeScript
/**
|
|
* 日志等级枚举
|
|
*
|
|
* - `debug` : 开发调试日志(最低)
|
|
* - `info` : 普通信息输出
|
|
* - `warn` : 警告信息
|
|
* - `error` : 错误信息(最高级别)
|
|
* - `silent` : 屏蔽所有日志
|
|
*/
|
|
export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';
|
|
|
|
/**
|
|
* 每个日志级别的优先级数值
|
|
* 数值越小,级别越低
|
|
*/
|
|
const levelPriority: Record<LogLevel, number> = {
|
|
debug: 0,
|
|
info: 1,
|
|
warn: 2,
|
|
error: 3,
|
|
silent: 4,
|
|
};
|
|
|
|
/**
|
|
* 检测当前运行环境应使用的日志等级:
|
|
*
|
|
* - 开发环境:默认 `debug`
|
|
* - 生产环境:默认 `warn`
|
|
* - 浏览器允许通过 `localStorage.DEBUG = 'true'` 强制开启 `debug`
|
|
*/
|
|
function detectInitialLevel(): LogLevel {
|
|
const isProduction = process.env.NODE_ENV === 'production';
|
|
if (import.meta.client && localStorage.getItem('DEBUG') === 'true') {
|
|
return 'debug';
|
|
}
|
|
|
|
return isProduction ? 'warn' : 'debug';
|
|
}
|
|
|
|
/**
|
|
* 核心日志类
|
|
*
|
|
* 提供 `debug / info / warn / error` 四个级别
|
|
* 并支持通过 `setLevel` 动态调整输出等级
|
|
*
|
|
* @example
|
|
* ```ts
|
|
* logger.debug('User data:', user)
|
|
* logger.error(new Error('Something broke'))
|
|
* logger.setLevel('silent')
|
|
* ```
|
|
*/
|
|
class Logger {
|
|
/** 当前日志等级(默认由 detectInitialLevel 判断) */
|
|
private level: LogLevel = detectInitialLevel();
|
|
|
|
/**
|
|
* 手动设置日志输出级别
|
|
*
|
|
* @param level 目标日志级别
|
|
*
|
|
* @example
|
|
* ```ts
|
|
* logger.setLevel('silent') // 全部禁用
|
|
* logger.setLevel('debug') // 强制打印全部日志
|
|
* ```
|
|
*/
|
|
setLevel(newLevel: LogLevel) {
|
|
this.level = newLevel;
|
|
}
|
|
|
|
/**
|
|
* 判断当前等级是否允许输出指定日志
|
|
*/
|
|
private canLog(level: LogLevel): boolean {
|
|
return levelPriority[level] >= levelPriority[this.level];
|
|
}
|
|
|
|
/** 输出调试日志(开发阶段使用) */
|
|
debug(...args: unknown[]) {
|
|
if (this.canLog('debug')) console.debug('[DEBUG]', ...args);
|
|
}
|
|
|
|
/** 输出普通信息日志 */
|
|
info(...args: unknown[]) {
|
|
if (this.canLog('info')) console.info('[INFO]', ...args);
|
|
}
|
|
|
|
/** 输出警告日志 */
|
|
warn(...args: unknown[]) {
|
|
if (this.canLog('warn')) console.warn('[WARN]', ...args);
|
|
}
|
|
|
|
/** 输出错误日志 */
|
|
error(...args: unknown[]) {
|
|
if (this.canLog('error')) console.error('[ERROR]', ...args);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 默认导出的单例 logger
|
|
*
|
|
* @example
|
|
* ```ts
|
|
* import { logger } from '~/utils/logger'
|
|
*
|
|
* logger.info('App started')
|
|
* ```
|
|
*/
|
|
export const logger = new Logger();
|