思路就是,先查看think-logger3 file, datefile, basic的实现方式,自己在上面加以改造(think-logger的 底层实现就是log4js)
先自定义一个日志handler, 代码如下:
controller/myHandle.js
const log4js = require('log4js')
const _logger = Symbol('_logger')
log4js.addLayout('json', function(config) {
return function(logEvent) {
return JSON.stringify(logEvent.data[0]) + config.separator
}
})
module.exports = class {
/**
* @param {Object} config {} 配置传入的参数
*/
constructor(config) {
// console.log('=========', config)
this[_logger] = {};
const logConfig = this.formatConfig(config);
this.setLogger(logConfig);
}
debug(...args) {
return this[_logger].debug(...args);
}
info(...args) {
<!--如果你不需要系统的info日志也被记录到日志文件中,可以将这行代码注释-->
return this[_logger].info(...args)
}
warn(...args) {
return this[_logger].warn(...args);
}
error(...args) {
return this[_logger].error(...args);
}
configure(config) {
return log4js.configure(config);
}
setLogger(config, category) {
this.configure(config);
this[_logger] = log4js.getLogger(category);
}
formatConfig(config) {
let {level, filename, pattern, alwaysIncludePattern, absolute, layout} = config;
level = level ? level.toUpperCase() : 'ALL';
return Object.assign({
appenders: {
dateFile: {type: 'dateFile', filename, pattern, alwaysIncludePattern, absolute, layout}
},
categories: {
default: {appenders: ['dateFile'], level}
}
}, config);
}
}
复制代码
formatConfig 这个方法里面你可以实现自己想要的格式,因为我需要输出日期文件,所以我直接将think3-logger里面dateFile的实现方式直接copy过来了(就是懒哈!)
然后在adapter.js中进行配置, 如下: 有些时候,一些基本的功能满足不了我们,log4js允许我们自定义layout, 自定义的layout可以查看log4js文档自定义文档,我这里主要是需要将日志已json的方式输入到日志文件中。
config/adapter.js
exports.logger = {
type: 'customLog',
customLog: {
handle: MyHandle,
appenders: {
log: {
type: 'dateFile',
filename: path.join(think.ROOT_PATH, 'logs/app.log'),
pattern: '.yyyy-MM-dd',
layout: {
type: 'json',
separator: ','
}
}
},
categories: {
default: { appenders: ['log'], level: 'info' }
}
}
}
复制代码
在需要记录日志的地方直接引入使用就好:
const log4js = require('log4js')
const logger = log4js.getLogger()
logger.info('你需要记录的数据')
复制代码
第一次写文章,如果写的不对的地方,欢饮随时指正。