【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();
  }
相关推荐
Andytoms4 小时前
Android geckoview 集成,JS交互,官方demo
android·javascript·交互
知识分享小能手5 小时前
微信小程序入门学习教程,从入门到精通,微信小程序开发进阶(7)
前端·javascript·学习·程序人生·微信小程序·小程序·vue3
liangshanbo12158 小时前
React 18 的自动批处理
前端·javascript·react.js
sunbyte9 小时前
每日前端宝藏库 | tinykeys ✨
前端·javascript
Demoncode_y9 小时前
Vue3 + Three.js 实现 3D 汽车个性化定制及展示
前端·javascript·vue.js·3d·汽车·three.js
细节控菜鸡10 小时前
【2025最新】ArcGIS for JS 实现地图卷帘效果,动态修改参数(进阶版)
开发语言·javascript·arcgis
南屿im12 小时前
把代码变成“可改的树”:一文读懂前端 AST 的原理与实战
前端·javascript
mxd0184812 小时前
最常用的js加解密之RSA-SHA256 加密算法简介与 jsjiami 的结合使用指南
开发语言·javascript·ecmascript
HWL567912 小时前
输入框内容粘贴时   字符净化问题
前端·vue.js·后端·node.js