Nest里打印日志

今天来学习下在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

相关推荐
_Evan_Yao6 分钟前
对话的边界:HTTP 的克制,SSE 的流淌,WebSocket 的自由
java·后端·websocket·网络协议·http
危桥带雨20 分钟前
FLASH代码部分
java·后端·spring
Rust研习社1 小时前
添加依赖库时的 features 是什么?优雅实现编译期条件编译与模块化开发
开发语言·后端·rust
马艳泽1 小时前
接到新需求后快速产出可执行的方案和时间估算
后端
Rust研习社2 小时前
Rust 条件变量(Condvar)详解:线程同步的高效方式
后端·rust·编程语言
fliter2 小时前
用逆波兰表达式,彻底搞懂 Rust 宏的递归写法
后端
fliter2 小时前
不开端口,不配 DNS,用树莓派在家搭一个公网可访问的 Web 服务
后端
是你的小恐龙啊2 小时前
【腾讯位置服务开发者征文大赛】地图不再“冷静”:当腾讯位置服务遇上 AI,我打造了一个 AI 智能出行“全能大脑”
后端
Rust研习社2 小时前
Rust Channel 详解:线程间安全通信的利器
后端·rust·编程语言
lclcooky3 小时前
Spring Boot 整合 Keycloak
java·spring boot·后端