Nest.js系列——在 nest 中使用日志的多种方式

前言

在前端开发的过程中,在代码开发调试的过程中会使用日志的方式来查看代码的运行情况。如果有报错会在日志中打印出来,很方便于开发者进行查看。那么在后端开发中通常也是需要查看日志的,毋庸置疑在nestjs中也一样需要。而且后端的服务日志通常需要在控制台打印显示和通过日志文件保存,方便查看问题。这里就看下在nestjs中使用日志的方式有哪些。

nest 中自带的日志

首先新建一个项目,启动起来,看下控制台的输出

shell 复制代码
// 新建一个项目
nest new demoLog

// 启动项目
pnpm start:dev

启动之后会在控制台看到以下输出

其实这个就是控制台的日志,nest中内置的有一个Logger组件,默认就是用它来打印日志的,可以对它做个简单的使用。在AppController中使用一下。

ts 复制代码
import { Controller, Get, Logger } from '@nestjs/common'
import { AppService } from './app.service'

@Controller()
export class AppController {
  private logger = new Logger()
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    this.logger.debug('debug', 'water')
    this.logger.error('error', 'water')
    this.logger.log('log', 'water')
    this.logger.verbose('log', 'water')
    this.logger.warn('log', 'water')
    return this.appService.getHello()
  }
}

然后调用下get测试接口看下控制台打印的日志

从图中可以看出,日志有颜色区别,这也就代表着有不同的级别等级。

一般来说在新建一个nest的项目之后,默认是开启logger的,但是也可以通过配置来进行关闭和配置的等级

ts 复制代码
import { NestFactory } from '@nestjs/core'
import { AppModule } from './app.module'

async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    // logger: false
    // logger: ['warn','error']
  })
  await app.listen(3000)
}
bootstrap()

有时候觉得这个默认的log的格式不是想要的,也可以自定义这个logger组件,简单来自定义一下自带的logger组件。在src下新建一个customLogger文件

ts 复制代码
import { LoggerService } from '@nestjs/common'

export class CustomLogger implements LoggerService {
  log(message: string, context: string) {
    console.log(`这是个log>>>>>>>>>>>>[${context}]`, message)
  }

  error(message: string, context: string) {
    console.log(`这是个error>>>>>>>>>>>>[${context}]`, message)
  }

  warn(message: string, context: string) {
    console.log(`这是个warn>>>>>>>>>>>>[${context}]`, message)
  }
}

从启动项目和请求接口在控制台打印的就是自定义的样子,其实这个是把所有的都从新自定义了,也可以通过继承ConsoleLogger来实现

ts 复制代码
import { ConsoleLogger } from '@nestjs/common'

export class CustomLogger extends ConsoleLogger {
  log(message: string, context: string) {
    console.log(`就是一个log>>>>>>>>>>>>>>>[${context}]`, message)
  }
}

通过这个继承的方式,你修改的就会按照你修改的显示,而你没有修改的就用默认的显示。

在 nest 中使用 winston 日志工具

首先先下载这个 npm 包

shell 复制代码
pnpm add winston

在创建一个自定义的log文件customLogger

ts 复制代码
import { LoggerService } from '@nestjs/common'
import { createLogger, format, Logger, transports } from 'winston'

export class CustomLogger implements LoggerService {
  private logger: Logger

  constructor() {
    this.logger = createLogger({
      level: 'debug',
      format: format.combine(format.colorize(), format.simple()),
      transports: [new transports.Console()]
    })
  }

  log(message: string, context: string) {
    this.logger.log('info', `[${context}] ${message}`)
  }

  error(message: string, context: string) {
    this.logger.log('error', `[${context}] ${message}`)
  }

  warn(message: string, context: string) {
    this.logger.log('warn', `[${context}] ${message}`)
  }
}

然后在main.ts中使用这个自定义的logger组件,就和使用自定义的log一样

ts 复制代码
import { NestFactory } from '@nestjs/core'
import { AppModule } from './app.module'
import { CustomLogger } from './customLogger'

async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    logger: new CustomLogger()
  })
  await app.listen(3000)
}
bootstrap()

这里看下控制台的打印就是winston包来实现的了

日志和nest 默认的还是有点区别的,比如没有颜色的区分和时间的显示,其实这个是可以通过配置来改变的。通过在 new transports.Console()中传入配置进行更改,安装需要的包:

shell 复制代码
pnpm add dayjs
pnpm add chalk

然后对winston打印格式进行配置

ts 复制代码
new transports.Console({
  format: format.combine(
    format.colorize(),
    format.printf(({ context, level, message, time }) => {
      const appStr = chalk.green(`[NEST]`)
      const contextStr = chalk.yellow(`[${context}]`)

      return `${appStr} ${time} ${level} ${contextStr} ${message} `
    })
  )
})

看下项目启动时候的日志和访问接口打印的日志

后端的日志不像前端直接在控制台查看,是需要导入到文件中进行保存,然后方便后面查看问题,这个功能winston也是支持的,只需要做如下配置。在transports中加入如下配置。

ts 复制代码
new transports.File({
  format: format.combine(format.timestamp(), format.json()),
  filename: 'water.log',
  dirname: 'log'
})

从新启动项目或者请求接口就会创建这个文件 如果所有的日志信息都往这个文件里面写,后面肯定会越来越大,所以需要根据大小对文件进行切割,这里winston也是支持这个功能的。

ts 复制代码
new transports.File({
  format: format.combine(format.timestamp(), format.json()),
  filename: 'water.log',
  dirname: 'log',
  maxsize: 1024
})

在不停的新增日志的时候会自动根据大小切割文件

有时候是需要根据日期时间来进行切割的,这个也是支持的,需要安装一个包

shell 复制代码
pnpm add winston-daily-rotate-file

修改下上面写到文件的配置,用这个扩展下配置,原来那个写到文件的配置不要了

ts 复制代码
new transports.DailyRotateFile({
  level: 'info',
  dirname: 'log',
  filename: 'water-%DATE%.log',
  datePattern: 'YYYY-MM-DD-HH-mm',
  maxSize: '1k'
})

新增几条日志看生成的文件目录

很明显看出达到了预期

到此简单的winston使用已经集成到nest中了,还有更多的配置可以去官网查看。

小结

在 nestjs 中使用日志记录的方式,简单使用例子记录一下,希望对你有帮助,如果觉得有用,欢迎点赞

相关推荐
郑祎亦22 分钟前
Spring Boot 项目 myblog 整理
spring boot·后端·java-ee·maven·mybatis
本当迷ya34 分钟前
💖2025年不会Stream流被同事排挤了┭┮﹏┭┮(强烈建议实操)
后端·程序员
计算机毕设指导62 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
paopaokaka_luck2 小时前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
捂月3 小时前
Spring Boot 深度解析:快速构建高效、现代化的 Web 应用程序
前端·spring boot·后端
瓜牛_gn3 小时前
依赖注入注解
java·后端·spring
Estar.Lee4 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
喜欢猪猪4 小时前
Django:从入门到精通
后端·python·django
一个小坑货4 小时前
Cargo Rust 的包管理器
开发语言·后端·rust
bluebonnet274 小时前
【Rust练习】22.HashMap
开发语言·后端·rust