思路就是,先檢視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('你需要記錄的資料')
複製程式碼
第一次寫文章,如果寫的不對的地方,歡飲隨時指正。