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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM