最近接了个新需求,让在服务器通过Nodejs去打日志文件,捕捉请求日志。。。
然后我就想到了log4js……
废话不多说,上代码
安装log4js
npm install log4js --save
对log4js不熟的查看文档 log4js;
在config文件夹下新建log_config.js文件:
1 | var log4js = require("log4js"); |
这段代码中有解释,照着官方文档配置就行;
在config文件夹下新建log.js文件:
1 | var log4js = require("./log_config"); |
这里边就是写个三个函数,
- 格式化请求日志 formatReqLog;
- 格式化响应日志 formatRes;
- 格式化错误日志 formatError;
在app.js中配置使用
1 | const log = require("./config/log"); |
代码没啥可讲的,照着使用就行,这里我来谈谈踩过的坑吧
故障1: pm2 + log4js启动项目时候报错
Nodejs application Error: bind EADDRINUSE when use pm2 deploy
sudo lsof -i -P | grep 3000
故障2: log4js搭配pm2集群异常日志
参考如下链接:log4js搭配pm2集群异常日志的解决方案
这是pm2在cluster模式下启动,导致log4js不正常输出日志,有两种解决方案吗,
只需要在log_config.js里添加如下命令就行
1
disableClustering: true
i. 安装pm2的
pm2-intercom
进程间通信模块
ii. 然后需要在log_config.js里添加如下命令就行1
2pm2: true,
pm2InstanceVar: 'INSTANCE_ID'iii. pm2.json 如下
1
2
3
4
5
6
7
8
9{ "apps": [
{ "name": "testing",
"script": "pm2.js",
"instances": 0,
"instance_var": "INSTANCE_ID", // 添加这一行
"exec_mode": "cluster"
}
]
}
两种解决方法的区别是:(摘自log4js作者的原话,能得到他的帮助,我特开心😊)
you don’t need `disableClustering` and `pm2` in your config.
`pm2: true` turns on support for using pm2-intercom, `disableClustering: true` turns off all clustering support so it won’t use pm2-intercom.
Use one or the other, but not both.
部署到服务器上就能正常输出日志了,如下
欢迎沟通交流
最后参考文章如下: