【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();
  }
相关推荐
kyriewen2 小时前
我把 AI 写的并发请求控制器手写了一遍——3 个语义我当时根本讲不清
前端·javascript·面试
_codemonster2 小时前
Vue中的ref和reactive到底在干嘛
前端·javascript·vue.js
张元清3 小时前
React useEventListener Hook:类型安全的 DOM 事件监听 (2026)
javascript·react.js
weixin_461408584 小时前
npm npx yarn
开发语言·前端·javascript
四千岁4 小时前
RAG系统中的分块
前端·javascript·后端
进击的明明4 小时前
闭包:JavaScript里的“随身背包” 🎒
前端·javascript·面试
我会冲击波7 小时前
vibe coding 一个多月,我把 Claude Code + Pi 做成了桌面 IDE,还给它移植了 VS Code 的编辑体验
前端·javascript·后端
码艺-Alimjan7 小时前
横向滚动组件纯用 CSS,丝滑鼠标滚动不许js
javascript·css·计算机外设
JimmtButler7 小时前
从 Java 到 JS:我终于把闭包想明白了
javascript·后端
常宇佳7 小时前
vue3 实战系列之无法识别vue组件
前端·javascript·vue.js