上禮拜第一次使用pm2的cluster模式,因為我的是node,利用pm2的cluster模式比較簡單,采坑采坑;
常規操作就是在pm2啟動文件配置 instances 和 exec_mode 字段,前一個定義實例個數,后者指定模式(fork / cluster)
{ "apps": [{ "name": "test", "script": "app.js", "watch": false, "error_file": "./logs/err.log", "out_file": "./logs/out.log", "log_date_format": "YYYY-MM-DD HH:mm Z", "instances" : 0, // 0 和 max 同義 "exec_mode" : "cluster", "env": { "NODE_ENV": "dev" } }] }
然后在log4js配置文件加 pm2: true
const log4js = require('log4js');
log4js.configure({
pm2: true, // 沒錯就是這行
appenders: {....},
categories: {....}
});
但是!!!常規操作在我這竟然失誤了!!!pm2啟動項目 啟動日志( info )沒有 警告日志正常的 撓后腦勺ing 怎么辦上網查
在網上看到有同道中人貼出了解決之法:
1. 安裝 pm2 的 pm2-intercom 進程間通信模塊(其實我的日志不打印問題裝了這個模塊之后就正常了,但是人方法還沒結束,繼續往下看)
pm2 install pm2-intercom
2. 在啟動文件里加個配置 instance_var
{ "apps": [{ "name": "test", "script": "app.js", "watch": false, "error_file": "./logs/err.log", "out_file": "./logs/out.log", "log_date_format": "YYYY-MM-DD HH:mm Z", "instance_var": "INSTANCE_ID", // 這里這里 "instances" : 0, "exec_mode" : "cluster", "env": { "NODE_ENV": "dev" } }] }
3. 在log4js配置文件也加個配置 pm2InstanceVar
const log4js = require('log4js');
log4js.configure({
pm2: true,
pm2InstanceVar: 'INSTANCE_ID', // 這里這里
appenders: {....},
categories: {....}
});
然后重新起項目,日志正常打印了,但是!!!有個問題,上圖:

每條日志的id是同一個,我把請求日志的 pid 也就是進程id打印出來,發現是我的四個進程id,也就是說日志都由其中一個進程在打印,這無疑會給這個進程相對多的壓力,這不是我想要的,pm2 cluster模式不是多實例多進程的嗎,為什么日志統一由一個進程打印??;據說是log4js在pm2 cluster模式下只有一個進程寫日志,其他進程的日志會發送到這個進程,如果不是這個原因或者我的操作有問題請大家指正;
暫時只能這樣,之后我會用其他方式吧,pm2 本身的日志分割我會去看看能不能按天分割,如果可以我會把log4js換下來,一個進程打日志實在不能忍
其實除了上面的這種方法,還有一種,但是這種方法多進程同時寫一個文件的時候會有沖突,導致日志丟失,所以我沒有用這個方法
上面的方法都不用做,只要在log4js配置里加 disableClustering
const log4js = require('log4js');
log4js.configure({
pm2: true,
disableClustering: true, // 這里這里
appenders: {....},
categories: {....}
});
就只加一行,每個進程個自打印日志;
就這樣 明日周末萬歲 L('ω')┘三└('ω')」
PS: 我把log4js 換了 winston,有興趣的可以看下篇。
