mstf-kit
Version:
一个现代化的 JavaScript/TypeScript 工具库,提供了丰富的常用工具函数
602 lines (467 loc) • 13.5 kB
Markdown
# Logger 使用指南
## 概述
`Logger` 是一个统一的日志工具类,提供可配置的日志输出功能。支持多种日志级别、时间戳、自定义前缀等特性。
## 主要特性
- ✅ 多种日志级别:NONE、ERROR、WARN、INFO、DEBUG
- ✅ 可配置的日志前缀
- ✅ 可选的时间戳显示
- ✅ 支持启用/禁用日志
- ✅ 支持自定义日志处理函数
- ✅ 支持创建子 Logger
- ✅ 提供分组、表格、计时等高级功能
- ✅ TypeScript 完整类型支持
## 基本使用
### 创建 Logger
```typescript
import { createLogger, LogLevel } from 'mstf-kit';
// 创建一个基本的 Logger
const logger = createLogger({
enabled: true,
prefix: '[MyApp]',
level: LogLevel.INFO
});
// 输出日志
logger.log('应用启动');
logger.info('这是一条信息');
logger.warn('这是一条警告');
logger.error('这是一条错误');
logger.debug('这是一条调试信息'); // 不会输出,因为级别是 INFO
```
### 日志级别
```typescript
import { LogLevel } from 'mstf-kit';
// 使用枚举
const logger1 = createLogger({
level: LogLevel.DEBUG // 输出所有日志
});
// 使用字符串
const logger2 = createLogger({
level: 'debug' // 等同于 LogLevel.DEBUG
});
// 可用的日志级别(从低到高):
// - LogLevel.NONE / 'none' - 不输出任何日志
// - LogLevel.ERROR / 'error' - 只输出错误
// - LogLevel.WARN / 'warn' - 输出警告和错误
// - LogLevel.INFO / 'info' - 输出信息、警告和错误(默认)
// - LogLevel.DEBUG / 'debug' - 输出所有日志
```
### 启用时间戳
```typescript
const logger = createLogger({
enabled: true,
prefix: '[MyApp]',
showTimestamp: true
});
logger.log('带时间戳的日志');
// 输出: [2024-03-10T12:34:56.789Z] [MyApp] 带时间戳的日志
```
### 动态控制
```typescript
const logger = createLogger({
enabled: true,
prefix: '[MyApp]'
});
// 禁用日志
logger.disable();
logger.log('这条不会输出');
// 启用日志
logger.enable();
logger.log('这条会输出');
// 修改日志级别
logger.setLevel(LogLevel.ERROR);
logger.info('这条不会输出'); // INFO < ERROR
logger.error('这条会输出');
// 修改前缀
logger.setPrefix('[NewPrefix]');
logger.log('新前缀的日志');
```
## 高级功能
### 创建子 Logger
```typescript
const mainLogger = createLogger({
enabled: true,
prefix: '[App]',
level: LogLevel.DEBUG
});
// 创建子 Logger,继承父 Logger 的配置
const authLogger = mainLogger.createChild('Auth');
const dbLogger = mainLogger.createChild('Database');
authLogger.log('用户登录'); // [App:Auth] 用户登录
dbLogger.log('连接数据库'); // [App:Database] 连接数据库
```
### 分组日志
```typescript
const logger = createLogger({
enabled: true,
prefix: '[MyApp]'
});
logger.group('用户操作');
logger.log('步骤1: 验证用户');
logger.log('步骤2: 加载数据');
logger.log('步骤3: 渲染界面');
logger.groupEnd();
// 折叠的分组
logger.groupCollapsed('详细信息');
logger.log('这些信息默认折叠');
logger.groupEnd();
```
### 表格输出
```typescript
const logger = createLogger({
enabled: true,
prefix: '[MyApp]'
});
const users = [
{ id: 1, name: 'Alice', age: 25 },
{ id: 2, name: 'Bob', age: 30 },
{ id: 3, name: 'Charlie', age: 35 }
];
logger.table(users);
```
### 计时功能
```typescript
const logger = createLogger({
enabled: true,
prefix: '[MyApp]',
level: LogLevel.DEBUG
});
logger.time('数据加载');
// 执行一些操作
await loadData();
logger.timeEnd('数据加载');
// 输出: [MyApp] 数据加载: 123.456ms
```
### 对象详细信息
```typescript
const logger = createLogger({
enabled: true,
prefix: '[MyApp]',
level: LogLevel.DEBUG
});
const complexObject = {
user: { id: 1, name: 'Alice' },
settings: { theme: 'dark', lang: 'zh' }
};
logger.dir(complexObject);
```
### 自定义日志处理
```typescript
const logger = createLogger({
enabled: true,
prefix: '[MyApp]',
customHandler: (level, prefix, ...args) => {
// 自定义处理逻辑,例如发送到服务器
const message = args.join(' ');
// 发送到日志服务
sendToLogServer({
level,
prefix,
message,
timestamp: new Date().toISOString()
});
// 同时输出到控制台
console.log(`${prefix} [${level}]`, ...args);
}
});
logger.log('这条日志会被自定义处理');
```
## 实际应用场景
### 场景1:在音频处理中使用
```typescript
import { createLogger, LogLevel, processNonStreamAudio } from 'mstf-kit';
// 创建音频处理专用的 Logger
const audioLogger = createLogger({
enabled: true,
prefix: '[AudioProcessor]',
level: LogLevel.DEBUG,
showTimestamp: true
});
async function processAudio(response: any) {
audioLogger.time('音频处理');
try {
audioLogger.log('开始处理音频数据');
const result = await processNonStreamAudio(response, {
audioField: 'data.audio',
dataType: 'base64',
debug: true // 内部也会使用 Logger
});
audioLogger.log('音频处理成功', {
size: result.size,
type: result.mimeType
});
audioLogger.timeEnd('音频处理');
return result;
} catch (error) {
audioLogger.error('音频处理失败:', error);
throw error;
}
}
```
### 场景2:模块化日志管理
```typescript
import { createLogger, LogLevel } from 'mstf-kit';
// 创建应用主 Logger
const appLogger = createLogger({
enabled: true,
prefix: '[App]',
level: process.env.NODE_ENV === 'development' ? LogLevel.DEBUG : LogLevel.INFO
});
// 为不同模块创建子 Logger
export const authLogger = appLogger.createChild('Auth');
export const apiLogger = appLogger.createChild('API');
export const uiLogger = appLogger.createChild('UI');
// 在不同模块中使用
// auth.ts
import { authLogger } from './logger';
export function login(username: string) {
authLogger.log('用户登录:', username);
// ...
}
// api.ts
import { apiLogger } from './logger';
export async function fetchData(url: string) {
apiLogger.time(`请求: ${url}`);
const response = await fetch(url);
apiLogger.timeEnd(`请求: ${url}`);
return response;
}
```
### 场景3:开发/生产环境切换
```typescript
import { createLogger, LogLevel } from 'mstf-kit';
// 根据环境变量配置日志
const isDevelopment = process.env.NODE_ENV === 'development';
const logger = createLogger({
enabled: isDevelopment, // 生产环境禁用日志
prefix: '[MyApp]',
level: isDevelopment ? LogLevel.DEBUG : LogLevel.ERROR,
showTimestamp: isDevelopment
});
// 开发环境会输出,生产环境不会
logger.debug('调试信息');
logger.info('普通信息');
// 生产环境也会输出错误
logger.error('错误信息');
```
### 场景4:性能监控
```typescript
import { createLogger, LogLevel } from 'mstf-kit';
const perfLogger = createLogger({
enabled: true,
prefix: '[Performance]',
level: LogLevel.DEBUG
});
class PerformanceMonitor {
private timers = new Map<string, number>();
start(label: string): void {
this.timers.set(label, performance.now());
perfLogger.debug(`开始计时: ${label}`);
}
end(label: string): number {
const startTime = this.timers.get(label);
if (!startTime) {
perfLogger.warn(`未找到计时器: ${label}`);
return 0;
}
const duration = performance.now() - startTime;
this.timers.delete(label);
perfLogger.log(`${label}: ${duration.toFixed(2)}ms`);
// 如果耗时过长,输出警告
if (duration > 1000) {
perfLogger.warn(`${label} 耗时过长: ${duration.toFixed(2)}ms`);
}
return duration;
}
report(): void {
perfLogger.group('性能报告');
perfLogger.log(`活跃计时器数量: ${this.timers.size}`);
if (this.timers.size > 0) {
const timers = Array.from(this.timers.entries()).map(([label, startTime]) => ({
label,
elapsed: `${(performance.now() - startTime).toFixed(2)}ms`
}));
perfLogger.table(timers);
}
perfLogger.groupEnd();
}
}
// 使用
const monitor = new PerformanceMonitor();
monitor.start('数据加载');
await loadData();
monitor.end('数据加载');
monitor.start('渲染界面');
await renderUI();
monitor.end('渲染界面');
monitor.report();
```
### 场景5:错误追踪
```typescript
import { createLogger, LogLevel } from 'mstf-kit';
const errorLogger = createLogger({
enabled: true,
prefix: '[ErrorTracker]',
level: LogLevel.ERROR,
showTimestamp: true,
customHandler: (level, prefix, ...args) => {
// 输出到控制台
console.error(prefix, ...args);
// 发送到错误追踪服务
if (level === 'ERROR') {
sendToErrorTracker({
message: args.join(' '),
timestamp: new Date().toISOString(),
userAgent: navigator.userAgent,
url: window.location.href
});
}
}
});
// 全局错误处理
window.addEventListener('error', (event) => {
errorLogger.error('全局错误:', {
message: event.message,
filename: event.filename,
lineno: event.lineno,
colno: event.colno
});
});
// Promise 错误处理
window.addEventListener('unhandledrejection', (event) => {
errorLogger.error('未处理的 Promise 拒绝:', event.reason);
});
// 手动记录错误
try {
riskyOperation();
} catch (error) {
errorLogger.error('操作失败:', error);
}
```
### 场景6:调试复杂流程
```typescript
import { createLogger, LogLevel } from 'mstf-kit';
const workflowLogger = createLogger({
enabled: true,
prefix: '[Workflow]',
level: LogLevel.DEBUG,
showTimestamp: true
});
async function complexWorkflow(data: any) {
workflowLogger.group('开始复杂工作流');
try {
// 步骤1
workflowLogger.log('步骤1: 验证数据');
workflowLogger.dir(data);
const validatedData = await validateData(data);
workflowLogger.log('✓ 数据验证通过');
// 步骤2
workflowLogger.log('步骤2: 处理数据');
workflowLogger.time('数据处理');
const processedData = await processData(validatedData);
workflowLogger.timeEnd('数据处理');
workflowLogger.log('✓ 数据处理完成');
// 步骤3
workflowLogger.log('步骤3: 保存结果');
const result = await saveResult(processedData);
workflowLogger.log('✓ 结果保存成功');
workflowLogger.log('工作流完成', { resultId: result.id });
return result;
} catch (error) {
workflowLogger.error('工作流失败:', error);
throw error;
} finally {
workflowLogger.groupEnd();
}
}
```
## API 参考
### Logger 类
```typescript
class Logger {
constructor(options?: LoggerOptions);
// 基本日志方法
debug(...args: any[]): void;
log(...args: any[]): void;
info(...args: any[]): void;
warn(...args: any[]): void;
error(...args: any[]): void;
// 分组方法
group(label: string): void;
groupCollapsed(label: string): void;
groupEnd(): void;
// 高级方法
table(data: any): void;
dir(obj: any): void;
time(label: string): void;
timeEnd(label: string): void;
// 控制方法
enable(): void;
disable(): void;
setLevel(level: LogLevel | string): void;
setPrefix(prefix: string): void;
// 查询方法
isEnabled(): boolean;
getLevel(): LogLevel;
// 创建子 Logger
createChild(subPrefix: string): Logger;
}
```
### LoggerOptions
```typescript
interface LoggerOptions {
enabled?: boolean; // 是否启用日志,默认 true
prefix?: string; // 日志前缀,默认 '[Logger]'
level?: LogLevel | string; // 日志级别,默认 LogLevel.INFO
showTimestamp?: boolean; // 是否显示时间戳,默认 false
customHandler?: (level: string, prefix: string, ...args: any[]) => void;
}
```
### LogLevel 枚举
```typescript
enum LogLevel {
NONE = 0, // 不输出任何日志
ERROR = 1, // 只输出错误
WARN = 2, // 输出警告和错误
INFO = 3, // 输出信息、警告和错误
DEBUG = 4 // 输出所有日志
}
```
### 工具函数
```typescript
// 创建 Logger 实例
function createLogger(options?: LoggerOptions): Logger;
// 默认的全局 Logger(禁用状态)
const defaultLogger: Logger;
```
## 最佳实践
1. **为不同模块创建独立的 Logger**
```typescript
const authLogger = createLogger({ prefix: '[Auth]' });
const apiLogger = createLogger({ prefix: '[API]' });
```
2. **使用子 Logger 管理层级关系**
```typescript
const appLogger = createLogger({ prefix: '[App]' });
const moduleLogger = appLogger.createChild('Module');
```
3. **根据环境配置日志级别**
```typescript
const level = process.env.NODE_ENV === 'production'
? LogLevel.ERROR
: LogLevel.DEBUG;
```
4. **使用计时功能监控性能**
```typescript
logger.time('操作');
await doSomething();
logger.timeEnd('操作');
```
5. **在生产环境禁用或限制日志**
```typescript
const logger = createLogger({
enabled: process.env.NODE_ENV !== 'production',
level: LogLevel.ERROR
});
```
## 总结
`Logger` 提供了一个统一、灵活、功能丰富的日志解决方案。通过合理使用日志级别、前缀和分组功能,可以有效地管理应用的日志输出,提高开发和调试效率。