pm2 cluster模式下log4js日誌不打印問題

上禮拜第一次使用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,有興趣的能夠看下篇。

相關文章
相關標籤/搜索