4基础篇:自定义日志

前言

在所有的后端服务中,日志是必不可少的一个关键环节,毕竟日常中我们不可能随时盯着控制台,问题的出现也会有随机性、不可预见性。一旦出现问题,要追踪错误以及解决,需要知道错误发生的原因、时间等细节信息。

之前的需求分析部分,在网关基础代理的服务中,网关作为所有业务流量的入口也有统一日志落库的需求。所以本章将介绍如何开发一个自定义的日志插件。

开启默认 Logger

NestJS 框架自带了 log 插件,如果只是普通使用,直接开启日志功能即可:

 
  

const app = await NestFactory.create(ApplicationModule, { logger: true });

但我们为了框架的性能使用 Fastify 来替换底层框架之后,需要使用下述代码来开启 Fastify 的日志系统:

 
  

const app = await NestFactory.create(AppModule, new FastifyAdapter({ logger: true }));

接下来,当我们访问 http://localhost:3000/ ,就可以看到控制台已经在正常打印接口请求的日志了:

虽然自带的日志功能开启之后,控制台能够正常打印日志,但是 Fastify 默认的日志输出格式无法满足业务需求。首先,无法快速区分日志类型,打印日志能参考的价值不大,其次,logger 并没有本地落库,后续查找也很麻烦,对于一个实战工程来说,快速定位日志问题以及有本地存储日志轮转等功能还是必要的。

自定义 Logger

既然自带的日志功能不能满足我们的业务需求,那就需要对默认的日志功能进行拓展。

  1. 安装几个必要的依赖:
 
  

$ yarn add fast-json-parse // 格式化返回对象 $ yarn add pino-multi-stream // 替换输出流 $ yarn add split2 // 处理文本流 $ yarn add dayjs // 可选,如果自己写时间格式化函数可以不用

  1. Fastify 作为一款专注于性能的 HTTP 框架,使用 pino 作为内置日志工具,下面是自定义日志的参数配置:
 
  

javascript

复制代码

const split = require('split2') const stream = split(JSON.parse) logger: { level: 'info', file: '/path/to/file' // 将调用 pino.destination() // stream: stream }

开启 file 配置的话,日志会自动存储在本地,如果开启 stream 的配置,就需要自己自定义修改配置,这两者是互斥的,只能配置一个

每个团队对日志的需求也并不相同,如果想对日志做更多定制化的功能,可以选择开启 stream 配置,自己开发所需要的日志功能。

logStream

  1. 新建 common/logger/logStream.ts 文件:
 
  

const chalk = require('chalk')

const dayjs = require('dayjs')

const

你可能感兴趣的:(NestJS,项目实战,后端,javascript,开发语言)