今天来学习下在Nest里打印日志的api。
首先先创建一个项目:
js
nest new log-nest -p pnpm
项目建成之后进入目录,执行命令启动项目:
js
npm run start:dev
之后我们就可以看到控制台打印的日志:
它同样也提供了这种日志打印的api
。
修改App.controller.ts
文件,引入Logger
:
之后我们进入浏览器,刷新页面,会发现控制台打印的信息:
这里的debug、error、log、verbose、warn
就是日志级别,而第一个参数
就是要打印的日志内容,第二个参数
就是上下文:
Nest
的日志打印是否开启是受控制的,可以在创建应用的时候选择是否开启: 在给logger
配置设置为false
的之后,nest
控制台中就没有了日志的打印。
同时它也可以支持配置打印指定级别的日志:
也可以自定义日志打印的方式:
首先新建一个日志文件,实现LoggerService
:
然后在创建应用时指定这个logger
: 之后会发现控制台打印的日志就是按照我们日志文件内定义的方式打印的:
刷新之后的日志打印也是按照自定义的方式打印的:
我们只是测试下自定义logger。
也可以不自己实现LoggerService的全部方法,而是继承ConsoleLogger,重写一些方法:
js
import { ConsoleLogger } from '@nestjs/common';
export class Mylog2 extends ConsoleLogger {
log(message: string, context: string) {
console.log(`[${context}]`, message);
}
}
因为ConsoleLogger实现了LoggerService的接口:
这样没重写的方法就是原来的:
这就是创建应用时logger的三种取值:
但是这样有个问题,没法注入依赖,因为logger是在容器外面手动实例出来的对象。
这时候可以这样:
bufferLogs
就是先不打印日志,把它放到buffer缓冲区,直到用useLogger指定了Logger并且应用初始化完毕。
app.get 就是从容器中取出这个类的实例的,我们写一个logger类放到容器中:
js
import { ConsoleLogger, Inject, Injectable } from '@nestjs/common';
import { AppService } from './app.service';
@Injectable()
export class MyLogger1 extends ConsoleLogger {
@Inject(AppService)
private appService: AppService;
log(message: any, context?: string): void {
console.log(this.appService.getHello());
console.log(`[${context}]`, message);
console.log('------Mylogger1-----');
}
}
添加@Injectable()
装饰器,代表这个是provider,并且要在Module里引入:
通过@Inject
注入AppService
,并在log的时候调用:
logger里成功注入了appService的日志。
现在可以单独抽一个模块来放logger:
js
nest g module logger
把这个module设置为全局模块:
js
import { Global, Module } from '@nestjs/common';
import { Mylog } from './mylog';
@Global()
@Module({
providers: [Mylog],
exports: [Mylog],
})
export class LoggerModule {}
这样在任何地方都可以注入这个logger对象了。
创建一个新模块:
js
nest g resource aaa
在这个模块里可以直接注入MyLogger,不用imports那个Module。
之后访问http://localhost:3000/aaa
的路由,刷新页面,会看到控制台打印的日志: 可以看到成功注入了Mylog
。