mmayanshuo 2019-06-26
最近在为服务端添加日志,主要是利用PM2和winston、log4js,现将遇到的问题记录下来。
PM2被用于生产环境下进程管理,能够及时获取业务代码中日志信息。
PM2 能够获得项目中 winston.log.error or console.log.info 信息。基本配置如下,访问localhost:8087,会在error_file打印出一条日志。
PS:建议不用直接使用console.log来输出日志信息,减少性能损耗。
// 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 在cluster模式时,worker进程将日志发送给master进程,然后记录到文件。但pm2 在cluster模式时,是将所有进程当做worker进程。导致log4js 在 PM2 cluster下不输出日志。
测试代码如下:
// 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 文件如下
{ 
    "apps": [
        { 
            "name": "testing",
            "script": "logger.js",
            "instances": "max",
            "exec_mode": "cluster"
        }
    ]
}修复方法如下,需要安装pm2的pm2-intercom进程间通信模块
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"
      }
    ]
}PM2 cluster or Node cluster 真有好处吗?好处能有多大?
通过什么样的压力测试才能检验出性能,才能查看系统的鲁棒性?
如何做小流量?
Node端的日志插件Log4js,以后版本更新了继续跟进安装&&版本npm install log4js. "log4js": "2.9.0",最简单的写法var log4js = require;a