Skip to content

日志管理

youlai-nest 采用 NestJS 内置日志系统,支持多环境配置。

日志框架

技术选型

组件说明
NestJS LoggerNestJS 内置日志器
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日志配置

参考资料

基于 MIT 许可发布