consola 使用
简介
consola: 用于 Node.js 和浏览器的优雅控制台记录器。
我目前用到的功能只有:
- 设置日志级别控制输出内容
- 自定义 reporter
- 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
。
可以通过 Tag
为 consola
实例划分为不同的职责,.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
中的 httpLogger
、schedulingJobLogger
、debugLogger
就可以实现统一入口的日志记录了,在自定义记录器中通过 tag
字段区分来自于哪个 logger
,consola
还有一个功能,就是将所有的 console
日志重定向到 consola
,这个我暂时用不到,可以看仓库主页的介绍了解。