日志管理
youlai-nest 采用 NestJS 内置日志系统,支持多环境配置。
日志框架
技术选型
| 组件 | 说明 |
|---|---|
| NestJS Logger | NestJS 内置日志器 |
| Winston | 可选的高级日志库 |
日志级别
日志级别从低到高:
verbose < debug < log < warn < error| 级别 | 说明 | 适用场景 |
|---|---|---|
| verbose | 详细信息 | 调试追踪 |
| debug | 调试信息 | 开发调试 |
| log | 普通信息 | 关键业务节点 |
| warn | 警告信息 | 潜在问题提示 |
| error | 错误信息 | 异常情况记录 |
日志配置
main.ts 配置
typescript
import { Logger } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create(AppModule, {
logger: ['log', 'error', 'warn', 'debug', 'verbose'],
});
await app.listen(3000);
}
bootstrap();自定义 Logger
typescript
import { LoggerService, Injectable } from '@nestjs/common';
@Injectable()
export class CustomLogger implements LoggerService {
log(message: string) {
console.log(`[LOG] ${new Date().toISOString()} - ${message}`);
}
error(message: string, trace: string) {
console.error(`[ERROR] ${new Date().toISOString()} - ${message}`);
console.error(trace);
}
warn(message: string) {
console.warn(`[WARN] ${new Date().toISOString()} - ${message}`);
}
debug(message: string) {
console.debug(`[DEBUG] ${new Date().toISOString()} - ${message}`);
}
verbose(message: string) {
console.log(`[VERBOSE] ${new Date().toISOString()} - ${message}`);
}
}日志使用
基本用法
typescript
import { Injectable, Logger } from '@nestjs/common';
@Injectable()
export class UserService {
private readonly logger = new Logger(UserService.name);
async login(username: string) {
this.logger.log(`用户登录: ${username}`);
try {
// 业务处理
} catch (error) {
this.logger.error(`登录失败: ${username}`, error.stack);
}
}
}上下文日志
typescript
this.logger.log('用户登录成功');
this.logger.warn('密码即将过期');
this.logger.error('登录失败', error.stack);Winston 集成
安装依赖
bash
pnpm add nest-winston winston配置
typescript
import { WinstonModule } from 'nest-winston';
import * as winston from 'winston';
@Module({
imports: [
WinstonModule.forRoot({
transports: [
new winston.transports.Console({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.colorize(),
winston.format.printf(({ timestamp, level, message }) => {
return `${timestamp} [${level}]: ${message}`;
}),
),
}),
new winston.transports.File({
filename: 'logs/application.log',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json(),
),
}),
],
}),
],
})
export class AppModule {}日志文件配置
滚动策略
typescript
import * as winston from 'winston';
import DailyRotateFile from 'winston-daily-rotate-file';
new DailyRotateFile({
filename: 'logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '14d',
});多环境配置
| 环境 | 输出 | 级别 |
|---|---|---|
| 开发 | 控制台 | debug |
| 生产 | 文件 + 控制台 | info |
Docker 日志管理
目录挂载
yaml
# docker-compose.yml
services:
youlai-nest:
volumes:
- /logs/youlai-nest:/app/logs日志查看
bash
# 查看当前日志
tail -f logs/application.log
# Docker 容器日志
docker logs -f youlai-nest相关文件
| 文件 | 说明 |
|---|---|
src/shared/logger/ | 日志模块 |
src/main.ts | 日志配置 |
