日志
Tachybase 日志基于 Winston 封装。默认情况下,Tachybase 将日志分为接口请求日志、系统运行日志和 SQL 执行日志,其中接口请求日志和 SQL 执行日志由应用内部打印,插件开发者通常只需要打印插件相关的系统运行日志。
本文档主要介绍在开发插件的时候,如何创建和打印日志。
默认打印方法
Tachybase 提供了系统运行日志的打印方法,日志按照规定字段打印,同时输出到指定文件。
// 默认打印方法
app.log.info("message");
// 在中间件中使用
async function (ctx, next) {
ctx.log.info("message");
}
// 在插件中使用
class CustomPlugin extends Plugin {
async load() {
this.log.info("message");
}
}
以上方法都遵循下面的用法:
第一个参数为日志消息,第二个参数为可选 metadata 对象,可以是任意键值对,其中 module
, submodule
, method
会被提取为单独字段,其余字段则放到 meta
字段中。
app.log.info('message', {
module: 'module',
submodule: 'submodule',
method: 'method',
key1: 'value1',
key2: 'value2',
});
// => level=info timestamp=2023-12-27 10:30:23 message=message module=module submodule=submodule method=method meta={"key1": "value1", "key2": "value2"}
app.log.debug();
app.log.warn();
app.log.error();
输出到其他文件
如果想沿用系统默认的打印方法,但是不想输出到默认的文件中,可以使用 createSystemLogger
创建一个自定义的系统日志实例。
import { createSystemLogger } from '@tachybase/logger';
const logger = createSystemLogger({
dirname: '/pathto/',
filename: 'xxx',
seperateError: true, // 是否将 error 级别日志单独输出到 'xxx_error.log'
});
自定义日志
如果不想使用系统提供的打印方法,想使用 Winston 原生的方法,可以通过以下方法创建日志。
createLogger
import { createLogger } from '@tachybase/logger';
const logger = createLogger({
// options
});
options
在原来 winston.LoggerOptions
的基础上进行了扩展。
transports
- 可以使用 'console' | 'file' | 'dailyRotateFile'
应用预置的输出方式。
format
- 可以使用 'logfmt' | 'json' | 'delimiter'
应用预置的打印格式。
app.createLogger
在多应用的场景下,有时候我们希望自定义的输出目录和文件,可以输出到当前应用名称的目录下。
app.createLogger({
dirname: '',
filename: 'custom', // 输出到 /storage/logs/main/custom.log
});
plugin.createLogger
使用场景和用法同 app.createLogger
.
class CustomPlugin extends Plugin {
async load() {
const logger = this.createLogger({
// 输出到 /storage/logs/main/custom-plugin/YYYY-MM-DD.log
dirname: 'custom-plugin',
filename: '%DATE%.log',
transports: ['dailyRotateFile'],
});
}
}