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