最近在为服务端添加日志,主要是利用PM2和winston、log4js,现将遇到的问题记录下来。html
PM2被用于生产环境下进程管理,可以及时获取业务代码中日志信息。node
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 在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" } ] }
PM2 cluster or Node cluster 真有好处吗?好处能有多大?测试
经过什么样的压力测试才能检验出性能,才能查看系统的鲁棒性?
如何作小流量?