Skip to content

日志分级

可以基于分级控制写入日志文件的消息内容

NPM分级

VonaJS 采用 NPM 分级规则,参见: RFC5424

typescript
const levels = {
  error: 0,
  warn: 1,
  info: 2,
  http: 3,
  verbose: 4,
  debug: 5,
  silly: 6
};

输出方法

与分级对应的是一组输出方法

typescript
this.$logger.error('test');
this.$logger.warn('test');
this.$logger.info('test');
this.$logger.http('test');
this.$logger.verbose('test');
this.$logger.debug('test');
this.$logger.silly('test');

默认分级

VonaJS 的默认分级是info,从而可以控制只有<=info的分级日志才写入文件

1. makeTransportFile

我们在新建order Client,可以通过makeTransportFile方法实现此策略: 只有<=info的分级日志才写入文件

diff
// logger
config.logger = {
  clients: {
    order(this: VonaApplication, clientInfo) {
      const transports = [
+       this.bean.logger.makeTransportFile(clientInfo, 'order'),
        this.bean.logger.makeTransportConsole(clientInfo),
      ];
      return { transports };
    },
  },
};

2. makeTransportFile: 独立文件

如果需要强制某个分级的日志写入独立的文件,可以再增加一个文件通道。比如,将debug分级的日志写入文件order-debug

diff
// logger
config.logger = {
  clients: {
    order(this: VonaApplication, clientInfo) {
      const transports = [
+       this.bean.logger.makeTransportFile(clientInfo, 'order-debug', 'debug'),
        this.bean.logger.makeTransportFile(clientInfo, 'order'),
        this.bean.logger.makeTransportConsole(clientInfo),
      ];
      return { transports };
    },
  },
};

3. makeTransportConsole

对于控制台通道,有一个特殊约定:凡是silly分级的日志,都会输出到控制台。因此,通过makeTransportConsole方法实现此策略

diff
// logger
config.logger = {
  clients: {
    order(this: VonaApplication, clientInfo) {
      const transports = [
        this.bean.logger.makeTransportFile(clientInfo, 'order'),
+       this.bean.logger.makeTransportConsole(clientInfo),
      ];
      return { transports };
    },
  },
};

默认分级配置

可以通过.env 文件修改默认的分级配置

由于可以配置多个 Clients,因此,Clients 可以单独配置自己的默认分级

1. Client: default

typescript
LOGGER_CLIENT_DEFAULT =

支持如下值:(empty)/true/false/{level}

比如,希望<=debug分级的日志写入文件,那么,配置如下:

typescript
LOGGER_CLIENT_DEFAULT = debug

也可以直接在控制台设置环境变量:

bash
LOGGER_CLIENT_DEFAULT=debug npm run dev

2. Client: order

对于新增的 Client order,也可以设置默认分级:

typescript
LOGGER_CLIENT_ORDER = verbose

获取当前分级

在系统运行中可以获取当前分级:

typescript
class ControllerStudent {
  async test() {
    // logger: default
    const levelDefault = this.bean.logger.getLevel();
    // logger: order
    const levelOrder = this.bean.logger.getLevel('order');
  }
}

动态修改分级

在系统运行中可以动态修改分级,从而在不停机、不重启的情况下,随时控制基于分级的写入策略

当调用setLevel方法时,系统会自动广播至所有 Workers,从而修改每个工作进程中的当前分级

typescript
class ControllerStudent {
  async test() {
    // level: info
    let levelDefault = this.bean.logger.getLevel();
    assert.equal(levelDefault, 'info');
    this.$logger.debug('1: this line will not output');
    // level: debug
    this.bean.logger.setLevel('debug');
    levelDefault = this.bean.logger.getLevel();
    assert.equal(levelDefault, 'debug');
    this.$logger.debug('2: this line will output');
    // disable
    this.bean.logger.setLevel(false);
    levelDefault = this.bean.logger.getLevel();
    assert.equal(levelDefault, false);
    this.$logger.info('3: this line will not output');
    this.$logger.debug('4: this line will not output');
    // enable
    this.bean.logger.setLevel(true);
  }
}

基于 MIT 许可发布