feat: 添加自定义logger用于输出日志 #68
@ -37,7 +37,7 @@ export const useMeilisearch = () => {
|
|||||||
|
|
||||||
const host = runtimeConfig.public?.meili?.host;
|
const host = runtimeConfig.public?.meili?.host;
|
||||||
if (!host) {
|
if (!host) {
|
||||||
console.warn('Meilisearch host is not configured.');
|
logger.warn('Meilisearch host is not configured.');
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
const apiKey = runtimeConfig.public?.meili?.searchKey;
|
const apiKey = runtimeConfig.public?.meili?.searchKey;
|
||||||
@ -76,7 +76,7 @@ export const useMeilisearch = () => {
|
|||||||
|
|
||||||
const activeIndexes = indexes.value as K[];
|
const activeIndexes = indexes.value as K[];
|
||||||
if (!activeIndexes.length) {
|
if (!activeIndexes.length) {
|
||||||
console.warn('No Meilisearch indexes configured.');
|
logger.warn('No Meilisearch indexes configured.');
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
const rawIndexMap = Object.fromEntries(
|
const rawIndexMap = Object.fromEntries(
|
||||||
@ -105,7 +105,7 @@ export const useMeilisearch = () => {
|
|||||||
result.status === 'rejected'
|
result.status === 'rejected'
|
||||||
)
|
)
|
||||||
.forEach((result) => {
|
.forEach((result) => {
|
||||||
console.error('Meilisearch query failed', result.reason);
|
logger.error('Meilisearch query failed', result.reason);
|
||||||
});
|
});
|
||||||
|
|
||||||
return settled
|
return settled
|
||||||
|
|||||||
@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
watch(error, (value) => {
|
watch(error, (value) => {
|
||||||
if (value) {
|
if (value) {
|
||||||
console.error('数据获取失败: ', value);
|
logger.error('数据获取失败: ', value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
watch(error, (value) => {
|
watch(error, (value) => {
|
||||||
if (value) {
|
if (value) {
|
||||||
console.error('数据获取失败: ', value);
|
logger.error('数据获取失败: ', value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -55,7 +55,7 @@
|
|||||||
|
|
||||||
watch(error, (value) => {
|
watch(error, (value) => {
|
||||||
if (value) {
|
if (value) {
|
||||||
console.error('数据获取失败: ', value);
|
logger.error('数据获取失败: ', value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -83,7 +83,7 @@
|
|||||||
|
|
||||||
watch(error, (value) => {
|
watch(error, (value) => {
|
||||||
if (value) {
|
if (value) {
|
||||||
console.error('数据获取失败: ', value);
|
logger.error('数据获取失败: ', value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -86,7 +86,7 @@
|
|||||||
|
|
||||||
watch(error, (value) => {
|
watch(error, (value) => {
|
||||||
if (value) {
|
if (value) {
|
||||||
console.error('数据获取失败: ', value);
|
logger.error('数据获取失败: ', value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
watch(error, (value) => {
|
watch(error, (value) => {
|
||||||
if (value) {
|
if (value) {
|
||||||
console.error('数据获取失败: ', value);
|
logger.error('数据获取失败: ', value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -83,7 +83,7 @@
|
|||||||
|
|
||||||
watch(error, (value) => {
|
watch(error, (value) => {
|
||||||
if (value) {
|
if (value) {
|
||||||
console.error('数据获取失败: ', value);
|
logger.error('数据获取失败: ', value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
watch(error, (value) => {
|
watch(error, (value) => {
|
||||||
if (value) {
|
if (value) {
|
||||||
console.error('数据获取失败: ', value);
|
logger.error('数据获取失败: ', value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -104,7 +104,7 @@
|
|||||||
|
|
||||||
watch(error, (value) => {
|
watch(error, (value) => {
|
||||||
if (value) {
|
if (value) {
|
||||||
console.error('数据获取失败: ', value);
|
logger.error('数据获取失败: ', value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -105,7 +105,7 @@
|
|||||||
|
|
||||||
watch(error, (value) => {
|
watch(error, (value) => {
|
||||||
if (value) {
|
if (value) {
|
||||||
console.error('数据获取失败: ', value);
|
logger.error('数据获取失败: ', value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -13,6 +13,7 @@ export default withNuxt(
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
'no-console': 'warn',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@ -46,7 +46,7 @@ export async function getFileMeta(id: string): Promise<FileMeta | null> {
|
|||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (error instanceof Error) {
|
if (error instanceof Error) {
|
||||||
console.error('Error fetching file metadata:', error.message);
|
logger.error('Error fetching file metadata:', error.message);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
112
shared/utils/logger.ts
Normal file
112
shared/utils/logger.ts
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
/* eslint-disable no-console -- console is allowed inside logger implementation */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日志等级枚举
|
||||||
|
*
|
||||||
|
* - `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();
|
||||||
Reference in New Issue
Block a user