上禮拜第一次使用pm2的cluster模式,由於個人是node,利用pm2的cluster模式比較簡單,採坑採坑;node
常規操做就是在pm2啓動文件配置 instances 和 exec_mode 字段,前一個定義實例個數,後者指定模式(fork / cluster)app
{ "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: trueui
const log4js = require('log4js'); log4js.configure({ pm2: true, // 沒錯就是這行 appenders: {....}, categories: {....} });
可是!!!常規操做在我這居然失誤了!!!pm2啓動項目 啓動日誌( info )沒有 警告日誌正常的 撓後腦勺ing 怎麼辦上網查spa
在網上看到有同道中人貼出瞭解決之法: 3d
1. 安裝 pm2 的 pm2-intercom 進程間通訊模塊(其實個人日誌不打印問題裝了這個模塊以後就正常了,可是人方法還沒結束,繼續往下看)日誌
pm2 install pm2-intercom
2. 在啓動文件里加個配置 instance_varcode
{ "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 orm
const log4js = require('log4js'); log4js.configure({ pm2: true, pm2InstanceVar: 'INSTANCE_ID', // 這裏這裏 appenders: {....}, categories: {....} });
而後從新起項目,日誌正常打印了,可是!!!有個問題,上圖:blog
每條日誌的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,有興趣的能夠看下篇。