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
。
日志等级用来表示该日志的级别,目前支持如下级别:
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
:目前支持如下类型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 需要实现以下几个方法:
module.exports = class {
/**
* @param {Object} config {} 配置传入的参数
*/
constructor(config) {
}
debug() {
}
info() {
}
warn() {
}
error() {
}
}