【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();
  }
相关推荐
paopaokaka_luck21 分钟前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
鶴哥只手遮天4 小时前
jQuery 4.0 源码架构与工程实践-第 10 章 尺寸、几何与显隐
前端·javascript·jquery
米米商聊7 小时前
图标能点,按钮就可用了吗?键盘、名称与收藏状态
前端·javascript
技术小甜甜8 小时前
【Cursor】Skill 被标黄色警告,怎么改成合格的 SKILL.md
开发语言·javascript·ai编程·cursor·1024程序员节·ai agent·skills
qetfw9 小时前
Bash 函数与流程控制:read、if、for、case 验证
linux·前端·javascript·bash
鬼手点金10 小时前
从 API 消息到模型 Token:Chat Template
java·前端·javascript·数据库·人工智能·深度学习·1024程序员节
Mr.Pascal12 小时前
Javascript之什么是作用域?
javascript·1024程序员节
microrain12 小时前
设备报文怎么变,SagooIoT 只约定三个函数名
javascript·物联网·golang·sagooiot
Bug收容所12 小时前
Vue+JS Day3
前端·javascript·vue.js·前端框架·1024程序员节
编程的一拳超人13 小时前
【元宝搜索开发者征文大赛】四语实战:Java/Python/Go/Node.js 构建 AI 搜索应用全攻略
java·python·golang·node.js·agent