【Nest】日志记录

内置Logger

默认的 nest 控制台日志配置:

复制代码
 const app = await NestFactory.create(AppModule, {
   logger: ['error', 'warn', 'log']
 });

当然,nest 内部也默认集成了日志模块:

复制代码
import { Logger } from '@nestjs/common';

 const logger = new Logger()
 logger.log(`Application is running on: http://localhost:${port}`);

在单个模块下使用:

ts 复制代码
export class UsersController {
  // 可以将一个参数传递给日志对象,一般我们设置为模块名
  private readonly logger = new Logger(UsersController.name);
  constructor(private readonly usersService: UsersService) {}

  @Get()
  @Roles(Role.admin)
  @ApiOperation({ summary: '获取所有用户' })
  @ApiResponse({ status: 200, description: '获取成功' })
  findAll() {
    this.logger.log('获取所有用户');
    return this.usersService.findAll();
  }
}

nestjs-pino

nestjs-pino

pino 有一个特点就是默认会打印日志(无需手动的 logger.log )。而且他很小,很简洁。

默认的打印和 console.log 一样(很丑陋),so 我们可以使用 pino-pretty 这个库来优化样式。这是在开发环境。

如果是生产环境下,我们可以使用 pino-roll 来记录定时记录日志,便于追踪用户行为。

winstom

winston 对于日志的集成度很高。

nest-winston

添加一个模块:

复制代码
nest g mo logs

logs.module.ts

ts 复制代码
import { Module } from "@nestjs/common";
import { utilities, WinstonModule } from "nest-winston";
import { ConfigService } from "@nestjs/config";
import * as Winston from "winston";
import * as DailyRotateFile from "winston-daily-rotate-file";

@Module({
  imports: [
    WinstonModule.forRootAsync({
      useFactory: (config: ConfigService) => {
        const consoleTransport = new Winston.transports.Console({
          level: "info",
          format: Winston.format.combine(
            Winston.format.timestamp(),
            utilities.format.nestLike()
          ),
        });

        const dailyTransport = new DailyRotateFile({
          level: config.get("LOG_LEVEL") || "info",
          filename: "logs/app-%DATE%.log",
          datePattern: "YYYY-MM-DD",
          zippedArchive: true,
          maxSize: "20m",
          maxFiles: "14d",
          format: Winston.format.combine(
            Winston.format.timestamp(),
            Winston.format.simple()
          ),
        });

        const dailyInfoTransport = new DailyRotateFile({
          level: config.get("LOG_LEVEL") || "warn",
          filename: "logs/app-info-%DATE%.log",
          datePattern: "YYYY-MM-DD",
          zippedArchive: true,
          maxSize: "20m",
          format: Winston.format.combine(
            Winston.format.timestamp(),
            Winston.format.simple()
          ),
        });
        return {
          transports: [
            consoleTransport,
            ...(config.get("LOG_ON")
              ? [dailyTransport, dailyInfoTransport]
              : []),
          ],
        };
      },
      inject: [ConfigService],
    }),
  ],
  providers: [],
  exports: [],
})
export class LogsModule {}

然后全局替换掉 nest 内置的日志记录:

main.ts

ts 复制代码
import { WINSTON_MODULE_NEST_PROVIDER } from 'nest-winston';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.useLogger(app.get(WINSTON_MODULE_NEST_PROVIDER))
  await app.listen(port);
}

依赖注入使用:

users.controller.ts

ts 复制代码
import { Controller, Get, Post, Body, Param, Delete, Put, UseGuards, ParseIntPipe, LoggerService, Inject } from '@nestjs/common';
// ....
import { WINSTON_MODULE_NEST_PROVIDER } from 'nest-winston';

@ApiTags('users')
@Controller('api/users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}
  constructor(
    private readonly usersService: UsersService,
    @Inject(WINSTON_MODULE_NEST_PROVIDER)
    private readonly logger: LoggerService
  ) {}

  @Get()
  findAll() {
    this.logger.log('获取所有用户');
    return this.usersService.findAll();
  }
相关推荐
会周易的程序员2 小时前
js-shm: 高性能 Node.js 共享内存模块
开发语言·javascript·c++·node.js·共享内存·shm
带娃的IT创业者2 小时前
重新定义前端构建速度:深度解析 SWC 如何用 Rust 颠覆 JavaScript 工具链
前端·javascript·rust·前端构建·swc
新中地GIS开发老师4 小时前
零基础WebGIS开发入门 | GeoJSON数据持久化
前端·javascript·gis·webgis·三维gis开发
blns_yxl4 小时前
正则驱动实时表单验证(HTML+CSS+JS+正则)
javascript·css·html
Quz5 小时前
QML 与 JavaScript 交互方式:内联函数、外部文件、信号槽与工作线程
javascript·qt
Allshadow5 小时前
Nest.js - 连接数据库
javascript·nestjs
冰暮流星5 小时前
javascript之date对象
开发语言·javascript·ecmascript
橘子星5 小时前
别光看教程!手把手拆解 React Todo 项目,一文吃透 5 个核心概念
前端·javascript
蜡台5 小时前
使用 uni-popup 实现数据选择器Data-Picker
前端·javascript·html·uniapp·uni-popup·data-picker
blns_yxl5 小时前
Promise封装Fetch + 重试机制(HTML+JS)
前端·javascript·html