Express搭建的项目在使用log4js与pm2共用时会出现log文件不能正常打印的问题,主要的解决方法就是引入pm2-intercom模块,并在集群配置文件中进行配置。
环境版本:
- Node: v8.9.3
- Express: v4.13.4
- pm2: v3.2.2
- log4js: v3.0.6
配置方法:
- 安装log4js: npm install log4js -g
- 在项目中加入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'})); } 复制代码
- 在项目目录下加入logs文件夹
- 下载pm2-intercom模块(该模块的引入是为了解决在pm2 cluster模式下log4js不能使用的问题)
- 在项目中新建pm2.json集群配置文件来启动集群,在文件中加入以下配置
"instance_var": "INSTANCE_ID", //为了解决与pm2 cluster冲突问题"output": "/dev/null", //禁用pm2存储log输出日志到本地文件"error": "/dev/null" //禁用pm2存储log错误日志到本地文件复制代码
- 在Express框架的app.js文件中引用封装好的log.js
var log4js = require('./jobs/log'); log4js.use(app); //该部分一定要在app.use(logger('dev'))之前,否则将不能打印请求的路由信息复制代码
使用方法:
- 生产环境与开发环境的切换
在log.js文件中对 log4js.getLogger()引用的值进行更改 const logger = log4js.getLogger('default'); //开发模式,日志不会写入日志文件,只会在控制台显示 const logger = log4js.getLogger('everything'); //生产模式 复制代码
- 文件中的日志输出
- 在需要打印日志的文件中引入const logger = require('./log').logger
- 日志打印:
log4js的输出级别6个(按级别由低到高排序): trace(蓝色)、debug(青色)、info(绿色)、warn(黄色)、error(红色)、fatal(粉色)
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'); 复制代码