日志与错误处理系统使用指南
概述
应用现在拥有完善的日志记录和错误处理系统,可以帮助你更好地追踪问题和调试。
日志系统 (logger.ts)
特性
- 分级日志: DEBUG, INFO, WARN, ERROR
- 自动文件持久化: 日志自动保存到
AppData/logs/app-YYYY-MM-DD.log - 控制台输出: 同时输出到浏览器控制台
- 日志缓冲: 保留最近 1000 条日志在内存中
- 详细上下文: 支持附加数据和堆栈信息
使用方法
1. 创建模块日志器
typescript
import { createModuleLogger } from '@/utils/logger';
const logger = createModuleLogger('MyModule');
// 使用
logger.debug('调试信息', { data: 'some data' });
logger.info('普通信息');
logger.warn('警告信息', { warning: 'details' });
logger.error('错误信息', error, { context: 'data' });2. 日志级别
typescript
// DEBUG - 调试信息
logger.debug('函数被调用', { params: { id: 123 } });
// INFO - 一般信息
logger.info('配置加载成功', { profileCount: 5 });
// WARN - 警告
logger.warn('API密钥未配置', { profileId: 'xxx' });
// ERROR - 错误
logger.error('请求失败', error, {
url: 'https://api.example.com',
status: 500
});3. 设置日志级别
typescript
import { logger, LogLevel } from '@/utils/logger';
// 仅记录 INFO 及以上级别
logger.setLevel(LogLevel.INFO);
// 开发环境显示所有日志
if (import.meta.env.DEV) {
logger.setLevel(LogLevel.DEBUG);
}错误处理系统 (errorHandler.ts)
特性
- 统一错误处理: 标准化所有错误
- 自动用户提示: 根据错误级别显示相应提示
- 错误队列: 保留最近 100 个错误记录
- 友好错误消息: 自动翻译技术错误为用户可理解的消息
- 与日志系统集成: 错误自动记录到日志
使用方法
1. 创建模块错误处理器
typescript
import { createModuleErrorHandler } from '@/utils/errorHandler';
const errorHandler = createModuleErrorHandler('MyModule');
// 基础使用
try {
// 可能出错的代码
await riskyOperation();
} catch (error) {
errorHandler.error(error, '操作失败,请重试');
}2. 不同错误级别
typescript
// INFO - 信息性提示
errorHandler.info(error, '这是一条信息');
// WARN - 警告
errorHandler.warn(error, '配置可能有问题');
// ERROR - 错误(默认)
errorHandler.error(error, '操作失败');
// CRITICAL - 严重错误(不自动关闭提示)
errorHandler.critical(error, '系统遇到严重错误');3. 异步函数包装
typescript
// 自动捕获异步错误
const result = await errorHandler.wrapAsync(
async () => {
return await fetchData();
},
{
userMessage: '获取数据失败',
context: { userId: 123 }
}
);
// result 为 null 表示出错
if (result) {
// 成功处理数据
}4. 同步函数包装
typescript
const result = errorHandler.wrapSync(
() => {
return parseComplexData(data);
},
{ userMessage: '数据解析失败' }
);全局错误捕获
系统已在 main.ts 中配置全局错误捕获:
1. Vue 错误捕获
typescript
// 自动捕获 Vue 组件中未处理的错误
app.config.errorHandler = (err, instance, info) => {
// 自动记录和处理
};2. Promise 错误捕获
typescript
// 自动捕获未处理的 Promise rejection
window.addEventListener('unhandledrejection', (event) => {
// 自动记录和处理
});3. 全局 JavaScript 错误
typescript
// 自动捕获全局错误
window.addEventListener('error', (event) => {
// 自动记录和处理
});最佳实践
1. 在 Composables 中
typescript
import { createModuleLogger } from '@/utils/logger';
import { createModuleErrorHandler } from '@/utils/errorHandler';
const logger = createModuleLogger('MyComposable');
const errorHandler = createModuleErrorHandler('MyComposable');
export function useMyFeature() {
const loadData = async () => {
try {
logger.info('开始加载数据');
const data = await fetchData();
logger.info('数据加载成功', { count: data.length });
return data;
} catch (error) {
logger.error('数据加载失败', error);
errorHandler.error(error, '无法加载数据,请重试');
return [];
}
};
return { loadData };
}2. 在组件中
typescript
<script setup lang="ts">
import { createModuleLogger } from '@/utils/logger';
import { createModuleErrorHandler } from '@/utils/errorHandler';
const logger = createModuleLogger('MyComponent');
const errorHandler = createModuleErrorHandler('MyComponent');
const handleSubmit = async () => {
try {
logger.debug('提交表单', { formData });
await submitForm(formData);
logger.info('表单提交成功');
ElMessage.success('保存成功');
} catch (error) {
errorHandler.error(error, '保存失败,请重试');
}
};
</script>3. 在 API 调用中
typescript
async function callApi() {
const logger = createModuleLogger('ApiCall');
logger.debug('发送API请求', { url, method });
try {
const response = await fetch(url, options);
if (!response.ok) {
const errorText = await response.text();
logger.error('API请求失败', new Error(errorText), {
status: response.status,
url
});
throw new Error(`请求失败 (${response.status})`);
}
logger.info('API请求成功', { url });
return await response.json();
} catch (error) {
logger.error('API调用异常', error, { url });
throw error;
}
}调试技巧
1. 查看日志文件
日志文件位于:AppData/aiohub/logs/app-YYYY-MM-DD.log
在 Windows 上通常是:
C:\Users\你的用户名\AppData\Roaming\com.mty.aiohub\logs\2. 查看内存中的日志
typescript
import { logger } from '@/utils/logger';
// 获取所有日志
const logs = logger.getLogBuffer();
console.table(logs);
// 清空日志缓冲
logger.clearBuffer();3. 查看错误队列
typescript
import { errorHandler } from '@/utils/errorHandler';
// 获取所有错误
const errors = errorHandler.getErrorQueue();
console.table(errors);
// 清空错误队列
errorHandler.clearErrorQueue();4. 导出日志
typescript
import { logger } from '@/utils/logger';
// 导出日志到文件
await logger.exportLogs('/path/to/export.log');常见问题
Q: 如何禁用某个模块的日志?
A: 设置更高的日志级别:
typescript
import { logger, LogLevel } from '@/utils/logger';
// 生产环境只记录错误
if (import.meta.env.PROD) {
logger.setLevel(LogLevel.ERROR);
}Q: 如何避免在控制台显示错误提示?
A: 使用 showToUser: false 选项:
typescript
errorHandler.handle(error, {
showToUser: false,
context: { silent: true }
});Q: 如何自定义错误消息?
A: 使用 userMessage 参数:
typescript
errorHandler.error(
error,
'自定义的用户友好消息',
{ additionalContext: 'data' }
);Q: 日志文件会占用大量空间吗?
A: 每天一个日志文件,建议定期清理旧日志。未来版本将添加自动清理功能。
迁移指南
从旧代码迁移
之前:
typescript
try {
await operation();
} catch (error) {
console.error('操作失败:', error);
ElMessage.error('操作失败');
}现在:
typescript
import { createModuleLogger } from '@/utils/logger';
import { createModuleErrorHandler } from '@/utils/errorHandler';
const logger = createModuleLogger('MyModule');
const errorHandler = createModuleErrorHandler('MyModule');
try {
await operation();
} catch (error) {
logger.error('操作失败', error);
errorHandler.error(error, '操作失败');
}或者更简洁:
typescript
const result = await errorHandler.wrapAsync(
() => operation(),
{ userMessage: '操作失败' }
);