PM2 && log4js && winston 日志管理

最近在为服务端添加日志,主要是利用PM2和winston、log4js,现将遇到的问题记录下来。html

PM2被用于生产环境下进程管理,可以及时获取业务代码中日志信息。node

PM2 基本设置以下

PM2 可以得到项目中 winston.log.error or console.log.info 信息。基本配置以下,访问localhost:8087,会在error_file打印出一条日志。git

PS:建议不用直接使用console.log来输出日志信息,减小性能损耗。github

// pm2.js
apps : [
        {
            name      : projectName,
            script    : 'app.js',
            env: {
                NODE_ENV: 'development',
                PORT: 8087
            },
            log_file : logFile,
            error_file : errorFile,
            out_file : outFile,
            merge_logs : true,
            log_date_format : 'YYYY-MM-DD HH:mm Z'
        }
    ]

// app.js
const Koa = require('koa');
const app = new Koa();
const winston = require('winston');

app.use(async ctx => {
    if (ctx.request.path === '/') {
        winston.log.error('测试日志');
    }
    ctx.body = 'Hello World';
});

app.listen(8087);

log4js 在 pm2 cluster 下不输出日志

log4js 在cluster模式时,worker进程将日志发送给master进程,而后记录到文件。但pm2 在cluster模式时,是将全部进程当作worker进程。致使log4js 在 PM2 cluster下不输出日志。json

测试代码以下:app

// logger.js
const log4js = require('log4js');

log4js.configure({
  appenders: {
    out: { type: 'file', filename: 'pm2logs.log' }
  },
  categories: {
    default: { appenders: ['out'], level: 'info' }
  }
});

const logger = log4js.getLogger('app');

setTimeout(() => {
  logger.info("I'm forever blowing bubbles");
}, 1000);

pm2.json 文件以下koa

{ 
    "apps": [
        { 
            "name": "testing",
            "script": "logger.js",
            "instances": "max",
            "exec_mode": "cluster"
        }
    ]
}

修复方法以下,须要安装pm2的pm2-intercom进程间通讯模块async

const log4js = require('log4js');

// NOTE: for PM2 support to work you'll need to install the pm2-intercom module
// `pm2 install pm2-intercom`
log4js.configure({
  appenders: {
    out: { type: 'file', filename: 'pm2logs.log' }
  },
  categories: {
    default: { appenders: ['out'], level: 'info' }
  },
  pm2: true,
  pm2InstanceVar: 'INSTANCE_ID'
});

const logger = log4js.getLogger('app');
setTimeout(() => {
  logger.info("I'm forever blowing bubbles");
}, 1000);

pm2.json 以下性能

{ "apps": [
    { "name": "testing",
      "script": "pm2.js",
      "instances": 0,
      "instance_var": "INSTANCE_ID",
      "exec_mode": "cluster"
      }
    ]
}

问题思考

  1. PM2 cluster or Node cluster 真有好处吗?好处能有多大?测试

  2. 经过什么样的压力测试才能检验出性能,才能查看系统的鲁棒性?

  3. 如何作小流量?

参考

  1. log4js donestn't work with pm2 cluster mode

  2. Frequently Asked Questions in log4js

  3. log4js多进程陷阱与避免

相关文章
相关标签/搜索