Loading

consola 使用

简介

consola: 用于 Node.js 和浏览器的优雅控制台记录器。

我目前用到的功能只有:

  1. 设置日志级别控制输出内容
  2. 自定义 reporter
  3. Tag

当然 consola 还有其他的功能,但是目前没有用到。

需要注意的是,consola 目前基本上没有人维护和迭代了,所以使用上有一定的风险,需要了解清楚之后,再引入到实际项目中。

安装

我当前的环境为:Node.js(ESM) + TypeScript

由于该库的 TS 类型是内置的,所以不需要单独安装类型依赖

yarn add consola

设置日志级别

设置日志级别的作用是为了控制日志的输出,如果设置为 -1,那么代表关闭所有日志输出,如果设置为 3,那么 0、1、2、3 级别的日志都会输出,而 4、5 级别的日志则会被忽略,数字越大,日志的等级就越低。

参考:https://github.com/unjs/consola/blob/4477e87a5153d31d22a2692565959d90599a6b61/src/types.js

silent(沉默, 即不打印任何级别的日志): -1
level 0: fatal、error
level 1: warn
level 2: log
level 3: info、success、ready、start
level 4: debug
level 5: trace、verbose

如果直接全局导入的,那么通过设置环境变量 CONSOLA_LEVEL=-1/0/1/2/3/4/5,如果不设置,默认的值为 3

import consola from consola;

consola.info(1);

如果使用 consola 的实例,那么该实例不会使用上述环境变量,而是使用实例初始化时的 level 字段,该字段的默认值为 3,当然我将环境变量的值作为 level 字段的值,这样就统一了。

定义 Reporter

Reporter 即日志报告者,当写下 consola.info(1) 时,consola 会循环所有的 Reporter,将相同的数据发给每一个 Reporter。

// reporter/storage.ts
import { ConsolaReporter, ConsolaReporterLogObject } from "consola";

export class StorageReporter implements ConsolaReporter {
  log(logObj: ConsolaReporterLogObject, args: ConsolaReporterArgs): void {
    console.log(logObj.tag, logObj.args[0]);
  }
}

定义统一的 consola 实例

在项目中,我们不能在每个地方导入 consola,这样不利于控制。

consola 中,假如没有设置 CONSOLA_LEVEL 或没有为 consola 实例指定 level,那么默认为 3

可以通过 Tagconsola 实例划分为不同的职责,.withTag([tag]) 可以在同一实例上应用多次,多个 Tag 的值按顺序使用用 : 号隔开,即 tag a:tag b

consola 并不支持 ESM,所以按照文档上的导入方式使用会报错,下述代码中的导入方式上面有一个 issue 链接,说明了这个问题,目前依然没有解决。

// logger.ts
import pkg from "consola";
import { StorageReporter } from "./reporter/storage";

// https://github.com/unjs/consola/issues/122#issuecomment-982148155
const { Consola, FancyReporter } = pkg as unknown as typeof import("consola");

/**
 * 注意:
 *
 * CONSOLA_LEVEL 环境变量只对全局 consola 生效,Consola 实例并不会使用该环境变量
 *
 * 日志级别,控制最终输出的日志,本地开发配置为 5,线上配置为 0
 * 参考:https://github.com/unjs/consola/blob/4477e87a5153d31d22a2692565959d90599a6b61/src/types.js
 *   silent(沉默, 即不打印任何级别的日志): -1
 *   level 0: fatal、error
 *   level 1: warn
 *   level 2: log
 *   level 3: info、success、ready、start
 *   level 4: debug
 *   level 5: trace、verbose
 */

const logger = new Consola({
  level: parseInt(process.env.CONSOLA_LEVEL ?? "3"), // LogLevel.Trace
  reporters: [new StorageReporter()],
});

if (process.env.NODE_ENV === "development") {
  logger.addReporter(new FancyReporter());
}

export const httpLogger = logger.withTag("HTTP");
export const schedulingJobLogger = logger.withTag("SchedulingJob");
export const debugLogger = logger.withTag("Debug");

使用

最后,通过导出 logger.ts 中的 httpLoggerschedulingJobLoggerdebugLogger 就可以实现统一入口的日志记录了,在自定义记录器中通过 tag 字段区分来自于哪个 loggerconsola 还有一个功能,就是将所有的 console 日志重定向到 consola,这个我暂时用不到,可以看仓库主页的介绍了解。

posted @ 2022-05-20 09:58  myEsn2E9  阅读(1385)  评论(1编辑  收藏  举报