NestJS 日志

96 阅读2分钟

Nest 附带一个默认的内部日志记录器实现,它在实例化过程中以及在一些不同的情况下使用,比如发生异常等等(例如系统记录)。这由 @nestjs/common 包中的 Logger 类实现。

  • 完全禁用日志
  • 指定日志系统详细水平(例如,展示错误,警告,调试信息等)
  • 覆盖默认日志记录器的时间戳(例如使用 ISO8601 标准作为日期格式)
  • 完全覆盖默认日志记录器
  • 通过扩展自定义默认日志记录器
  • 使用依赖注入来简化编写和测试你的应用

安装

npm install @nestjs/logger

基础自定义

要禁用日志,在app.module.ts

const app = await NestFactory.create(ApplicationModule, {
  logger: false,
});
await app.listen(3000);

根据级别显示

// 层次类型
export type LogLevel = 'log' | 'error' | 'warn' | 'debug' | 'verbose';

// 创建app时使用配置 logger 层次
const app = await NestFactory.create(ApplicationModule, {
  logger: ['error', 'warn'],
});
await app.listen(3000);

使用日志服务

import { Logger } from '@nestjs/common';
 
export class YourService {
  private readonly logger = new Logger(YourService.name);
 
  yourMethod(): void {
    this.logger.log('Your log message');
  }
}

配置日志模块

import { Module } from '@nestjs/common';
import { LoggerModule } from '@nestjs/logger';
 
@Module({
  imports: [
    LoggerModule.forRoot({
      // 配置logger选项,例如格式化输出
      format: 'dev', // 或 'json'
      // 其他配置...
    }),
  ],
  // ...
})
export class AppModule {}

存储到logs文件夹

安装依赖

npm i winston nest-winston winston-daily-rotate-file -S

logging.service.ts

import { Injectable } from '@nestjs/common';
import * as winston from 'winston';
import * as DailyRotateFile from 'winston-daily-rotate-file';
 
@Injectable()
export class LoggingService {
  private logger: winston.Logger;
 
  constructor() {
    this.logger = winston.createLogger({
      level: 'info',
      format: winston.format.json(),
      transports: [
        new DailyRotateFile({
          filename: 'application-%DATE%.log',
          dirname: './logs',
          datePattern: 'YYYY-MM-DD-HH',
          zippedArchive: true,
          maxSize: '10m',
          maxFiles: '1d', // keep only logs of last 24 hours
        }),
      ],
    });
  }
 
  logInfo(message: string) {
    this.logger.info(message);
  }
 
  logError(message: string) {
    this.logger.error(message);
  }
}

app.module.ts

import { LoggingService } from './logging.service';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService,LoggingService],
  exports: [LoggingService],
})
export class AppModule {
  constructor(private readonly loggingService: LoggingService) {
    loggingService.logInfo('Application started');
  }
}

logger打印

// cats.module.ts 引入logger
@Module({
  imports: [],
  controllers: [CatsController],
  providers: [CatsService,LoggingService]
})
export class CatsModule {}
import { Controller, Get, Logger } from '@nestjs/common';
 
@Controller()
export class AppController {
  constructor(private readonly logger: LoggingService) {}
 
  @Get('logger')
  index(): string {
    this.logger.log('log 类型日志');
    this.logger.warn('warn 类型日志');
    this.logger.error('error 类型日志');
    return 'Hello world'
  }
}