log4js在pm2 cluster模式下的配置與使用

Express搭建的項目在使用log4js與pm2共用時會出現log文件不能正常打印的問題,主要的解決方法就是引入pm2-intercom模塊,並在集羣配置文件中進行配置。javascript

環境版本:

  • Node: v8.9.3
  • Express: v4.13.4  
  • pm2: v3.2.2
  • log4js: v3.0.6

配置方法:

  1. 安裝log4js:   npm install log4js -g
  2. 在項目中加入log.js文件用於log4js的具體邏輯的封裝

    const log4js = require('log4js');
    log4js.configure({
        appenders: {
            console: { type: 'console' },
            everything: {
                 type: 'dateFile',
                 filename: 'logs/all-the-logs.log',
                 pattern: '.yyyy-MM-dd-hh',
                 compress: true ,
                 daysToKeep:30
            },
               },
        categories: {
          default: { appenders: ['console'], level: 'debug' },//開發模式
          log4jslog: { appenders: ["everything"], level: 'debug' }//生產模式
        },
         pm2: true,
         pm2InstanceVar: 'INSTANCE_ID'
    });
    const logger = log4js.getLogger('default');//開發模式與生產模式進行切換
    exports.logger = logger;
    exports.use = function(app){
         app.use(log4js.connectLogger(logger, { level: 'auto', format: ':method :url'}));
    }
    複製代碼
  3. 在項目目錄下加入logs文件夾 
  4. 下載pm2-intercom模塊(該模塊的引入是爲了解決在pm2 cluster模式下log4js不能使用的問題)
  5. 在項目中新建pm2.json集羣配置文件來啓動集羣,在文件中加入如下配置

    "instance_var": "INSTANCE_ID",  //爲了解決與pm2 cluster衝突問題"output": "/dev/null", //禁用pm2存儲log輸出日誌到本地文件"error": "/dev/null" //禁用pm2存儲log錯誤日誌到本地文件複製代碼
  6. 在Express框架的app.js文件中引用封裝好的log.js

    var log4js = require('./jobs/log');
    log4js.use(app); //該部分必定要在app.use(logger('dev'))以前,不然將不能打印請求的路由信息複製代碼

使用方法:

  1. 生產環境與開發環境的切換

    在log.js文件中對  log4js.getLogger()引用的值進行更改
    const logger = log4js.getLogger('default');  //開發模式,日誌不會寫入日誌文件,只會在控制檯顯示
    const logger = log4js.getLogger('everything');  //生產模式
    複製代碼

  2. 文件中的日誌輸出
  • 在須要打印日誌的文件中引入const logger = require('./log').logger
  • 日誌打印:

    log4js的輸出級別6個(按級別由低到高排序): trace(藍色)、debug(青色)、info(綠色)、warn(黃色)、error(紅色)、fatal(粉色)html

    logger.trace('this is trace');
    logger.debug('this is debug');
    logger.info('this is info');
    logger.warn('this is warn');
    logger.error('this is error');
    logger.fatal('this is fatal');
    複製代碼

       控制檯打印效果:

      

參考資料

相關文章
相關標籤/搜索