前言
在前端开发的过程中,在代码开发调试的过程中会使用日志的方式来查看代码的运行情况。如果有报错会在日志中打印出来,很方便于开发者进行查看。那么在后端开发中通常也是需要查看日志的,毋庸置疑在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
包来实现的了
日志和nes
t 默认的还是有点区别的,比如没有颜色的区分和时间的显示,其实这个是可以通过配置来改变的。通过在 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 中使用日志记录的方式,简单使用例子记录一下,希望对你有帮助,如果觉得有用,欢迎点赞