Logger
ThinkJS 通过 think-logger3 模块实现了强大的日志功能,并提供适配器扩展,可以很方便的扩展内置的日志模块。系统默认使用 log4js 模块作为底层日志记录模块,具有日志分级、日志分割、多进程等丰富的特性。
基本使用
系统已经全局注入了 logger 对象 think.logger
,其提供了 debug
, info
, warn
, error
四种方法来输出日志,日志默认是输出至控制台中。
think.logger.debug('debug message');
think.logger.info('info message');
think.logger.warn('warning');
think.logger.error(new Error('error'));
基本配置
系统默认自带了 Console
, File
, DateFile
三种适配器。默认是使用 Console
将日志输出到控制台中。
文件
如果想要将日志输出到文件,将以下内容追加到 src/config/adapter.js
文件中:
const path = require('path');
const {File} = require('think-logger3');
exports.logger = {
type: 'file',
file: {
handle: File,
backups: 10,
absolute: true,
maxLogSize: 50 * 1024, //50M
filename: path.join(think.ROOT_PATH, 'logs/xx.log')
}
}
该配置表示系统会将日志写入到 logs/xx.log
文件中。当该文件超过 maxLogSize
值时,会创建一个新的文件 logs/xx.log.1
。当日志文件数超过 backups
值时,旧的日志分块文件会被删除。文件类型目前支持如下参数:
- filename:日志文件地址
- maxLogSize:单日志文件最大大小,单位为 KB,默认日志没有大小限制。
- backups:最大分块地址文件数,默认为 5。
- absolute:filename 是否为绝对路径地址,如果 filename 是绝对路径,absolute 的值需要设置为 true。
- layouts:定义日志输出的格式。
日期文件
如果想要将日志按照日期文件划分的话,将以下内容追加到 src/config/adapter.js
文件中:
const path = require('path');
const {DateFile} = require('think-logger3');
exports.logger = {
type: 'dateFile',
dateFile: {
handle: DateFile,
level: 'ALL',
absolute: true,
pattern: '-yyyy-MM-dd',
alwaysIncludePattern: false,
filename: path.join(think.ROOT_PATH, 'logs/xx.log')
}
}
该配置会将日志写入到 logs/xx.log
文件中。隔天,该文件会被重命名为 xx.log-2017-07-01
(时间以当前时间为准),然后会创建新的 logs/xx.log
文件。时间文件类型支持如下参数:
- level:日志等级
- filename:日志文件地址
- absolute:filename 是否为绝对路径地址,如果 filename 是绝对路径,absolute 的值需要设置为 true。
- pattern:该参数定义时间格式字符串,新的时间文件会按照该格式格式化后追加到原有的文件名后面。目前支持如下格式化参数:
- yyyy - 四位数年份,也可以使用 yy 获取末位两位数年份
- MM - 数字表示的月份,有前导零
- dd - 月份中的第几天,有前导零的2位数字
- hh - 小时,24小时格式,有前导零
- mm - 分钟数,有前导零
- ss - 秒数,有前导零
- SSS - 毫秒数(不建议配置该格式以毫秒级来归类日志)
- O - 当前时区
- alwaysIncludePattern:如果 alwaysIncludePattern 设置为 true,则初始文件直接会被命名为 xx.log-2017-07-01,然后隔天会生成 xx.log-2017-07-02 的新文件。
- layout:定义日志输出的格式。
高级配置
如果以上配置都无法满足你的需求,你也可以直接提供 log4js 的配置。例如:
const path = require('path');
const {Basic} = require('think-logger3');
exports.logger = {
type: 'advanced',
advanced: {
handle: Basic,
appenders: {
everything: {
type: 'file',
filename: path.join(think.ROOT_PATH, 'logs/all-the-logs.log')
},
emergencies: {
type: 'file',
filename: path.join(think.ROOT_PATH, 'logs/oh-no-not-again.log')
},
'just-errors': {
type: 'logLevelFilter',
appender: 'emergencies',
level: 'error'
}
},
categories: {
default: {
appenders: ['just-errors', 'everything'],
level: 'debug'
}
}
}
};
该配置表示将 error
级别以上的日志输出到 oh-no-not-again.log
文件,同时还将所有的日志输出到all-the-logs.log
文件中。除了 handle
属性,所有的配置都和 log4js 的一样,你可以在 这里 查看详细的配置项。
另外需要注意的是,考虑到分类的用处比较少,我们不支持自定义日志分类,所以在 categories
中配置其它分类是无效的,但是默认分类需要存在。
注: 高级配置需要 think-logger3 >= 1.1.1
。
Level
日志等级用来表示该日志的级别,目前支持如下级别:
Console
, File
和 DateFile
类型都支持 layout
参数,表示输出日志的格式,值为对象,下面是一个简单的示例:
const path = require('path');
const {File} = require('think-logger3');
module.exports = {
type: 'file',
file: {
handle: File,
backups: 10,
absolute: true,
maxLogSize: 50 * 1024, //50M
filename: path.join(think.ROOT_PATH, 'logs/xx.log'),
layout: {
type: 'pattern',
pattern: '%[[%d] [%p]%] - %m',
}
}
}
默认的 Console
的输出格式是 %[[%d] [%z] [%p]%] - %m
,即 [时间] [进程ID] [日志等级] - 日志内容
。 目前 layout 支持如下参数:
- type:目前支持如下类型
- basic
- coloured
- messagePassThrough
- dummy
- pattern
- 自定义输出类型可参考 Adding your own layouts
- pattern:输出格式字符串,目前支持如下格式化参数
- %r - .toLocaleTimeString() 输出的时间格式,例如 下午5:13:04。
- %p - 日志等级
- %h - 机器名称
- %m - 日志内容
- %d - 时间,默认以 ISO8601 规范格式化,可选规范有 ISO8601, ISO8601_WITH_TZ_OFFSET, ABSOUTE, DATE 或者任何可支持格式化的字串,例如 %d{DATE} 或者 %d{yyyy/MM/dd-hh.mm.ss}。
- %% - 输出 % 字符串
- %n - 换行
- %z - 从 process.pid 中获取的进程 ID
- %[ - 颜色块开始区域
- %] - 颜色块结束区域
自定义 handle
如果觉得提供的日志输出类型不满足大家的需求,可以自定义日志处理的 handle
。自定义 handle 需要实现以下几个方法:
module.exports = class {
/**
* @param {Object} config {} 配置传入的参数
*/
constructor(config) {
}
debug() {
}
info() {
}
warn() {
}
error() {
}
}