日志系统 (Pino)
概述
ACE NestJS Starter 集成了高性能的 Pino 日志库,提供结构化日志、请求追踪和日志管理功能。
核心特性
- 高性能: 极低的性能开销
- 结构化日志: JSON 格式便于分析
- 请求追踪: 自动生成 traceId
- 日志级别: 支持多级别日志
- 日志轮转: 自动归档和清理
配置
基础配置
typescript
// src/app.module.ts
import { LoggerModule } from 'nestjs-pino';
@Module({
imports: [
LoggerModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (config: ConfigService) => ({
pinoHttp: {
level: config.get('log.level'),
transport:
config.get('app.env') === 'development'
? {
target: 'pino-pretty',
options: {
colorize: true,
levelFirst: true,
translateTime: 'SYS:standard',
},
}
: undefined,
},
}),
}),
],
})
export class AppModule {}日志级别
trace- 最详细的调试信息debug- 调试信息info- 一般信息(默认)warn- 警告信息error- 错误信息fatal- 致命错误
使用方法
基础日志
typescript
@Injectable()
export class UserService {
constructor(private readonly logger: Logger) {}
async createUser(data: CreateUserDto) {
this.logger.log('Creating user', { email: data.email });
try {
const user = await this.prisma.user.create({ data });
this.logger.log('User created successfully', { userId: user.id });
return user;
} catch (error) {
this.logger.error('Failed to create user', error.stack);
throw error;
}
}
}请求日志
自动记录所有 HTTP 请求:
- 请求方法和 URL
- 响应状态码
- 响应时间
- 用户信息
- TraceId
自定义日志格式
typescript
// 添加自定义属性
this.logger.log({
msg: 'Order processed',
orderId: order.id,
amount: order.amount,
customerId: customer.id,
metadata: { ... }
});日志管理
日志轮转
使用 pino-roll 实现日志文件轮转:
typescript
transport: {
targets: [
{
target: 'pino-roll',
options: {
frequency: 'daily',
size: '10M',
dateFormat: 'YYYY-MM-DD',
},
},
],
}日志聚合
集成 ELK Stack 或其他日志分析平台。
最佳实践
- 使用适当的日志级别
- 包含上下文信息
- 避免敏感信息
- 使用结构化日志
- 定期清理日志