pm2 cluster 模式下log4js使用问题
发布于 6 年前 作者 m1911star 4753 次浏览 来自 问答

node@6.9.1 pm2@2.9.1 log4js@1.1.0 pm2 start -i 4 test.js 这种模式下,写文件,会出现数据丢失的情况,不知道各位大神有没有遇到过?里面有啥坑吗,github里有issues也翻过,并没有解决,求解救

19 回复

我记得是直接写不到文件吧

pm2 cluster 模式下会其启动多个 node 实例,如果你每个实例上跑的是相同代码,那么很可能你写入文件的路径是相同的。如果是这种情况,多个实例在同时写一个文件,却没有并发控制,所以会有一定概率部分数据互相覆盖,造成数据丢失。 那么解决问题也就有思路了,最例如最简单的可以不同实例写入不同文件。

可以写多个日志文件,开4个线程的话就会写4份,每个单独写一份,需要统计的话用脚本处理下就好了

@XiaozhongLiu 可以的,通过设置之后,只是会出现一部分丢失

@sharp-c 感谢讲解,我们项目需求是需要写到一个日志文件,我试一下单独搞个进程监听数据,只通过一个进程写日志

@qiu363 需求是写同一份文件

@m1911star 不清楚你这什么原因, 我这个是ok的, 可以参考: https://github.com/xiaozhongliu/node-api-seed/blob/master/util/logger.js 我当时log4j新版本升级之后对于pm2 cluster模式不会写入文件, 装了pm2-intercom这个模块解决了.

@XiaozhongLiu 我这边用是可以写文件的,只是会丢失部分数据而已

@XiaozhongLiu log4js版本是1.1.0

@m1911star 直接上新版呗, 我给公司微服务在用

@XiaozhongLiu 怕坑多啊,维护着一个sdk,版本更新比较慎重

@m1911star 哈哈既然生产在用了, 那就最好不变

@XiaozhongLiu 太难了,我们产品是单纯的jq写前端,是我的主业,还维护一个node sdk做数据采集,坑真多

@m1911star js是可以写出干净简练, 可维护性很好的代码的, 参考我的项目. 奈何… jq挺好用, 但何不尝试一下更好用的vue, 进而react.

@XiaozhongLiu 历史包袱太多,业务发展太快,人员严重不足,所以……你懂的(一直想上react)

因为 cluster 的问题,你的日志如果按天分割,那么 cluster 出来的每一个进程的定时器判断过 12 点是不一致的,导致会丢失掉最后一个子进程覆盖生成第二天日志之前的部分

解决办法是 log4js 的日志分割模式不要使用 dateFile,即不要按天分割,写到一个日志文件 分割日志在服务器上写一个 linux 的 crontab 定时任务去做,这样就不会丢日志了

@hyj1991 我靠,还有这种坑,回头我试一下再来请教,非常感谢

@hyj1991 你这个方案写在一个文件,不是还是会出现冲突吗

@lvgithub 不会的

来自酷炫的 CNodeMD

回到顶部