日志分级
可以基于分级控制写入日志文件的消息内容
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 dev2. 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);
}
}