在thinkjs3中使用自定義日誌來滿足專案需求

lenlch發表於2018-09-11

思路就是,先檢視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('你需要記錄的資料')
複製程式碼

第一次寫文章,如果寫的不對的地方,歡飲隨時指正。

相關文章