【轉】log4js在PM2的cluster模式下大坑

請直接查看原文:https://blog.yourtion.com/fix-log4js-with-pm2-not-work.htmlhtml

以前一直使用 debug 還有 console.log 去打日誌,或者使用文件日誌模塊,以前用 log4js 也主要爲了把日誌傳輸到 ELK 上。新的項目上決定使用 log4js 來全面統一項目中的日誌,因此統一構建了一個日誌配置。node

在本地調試還有早期測試服務器部署都工做正常,多個配置項也輸出正常,可是在部署到正式服的時候,發現日誌不輸出了,文件也沒了記錄,在生產環境使用 node 運行跟配置一致的 log4js 也工做正常。api

一開始覺得是權限問題,對日誌目錄作了權限調整,切換到 /tmp 目錄都無濟於事,百般無奈的狀況下只好從新認真地跑去讀API文檔。服務器

結果在文檔 log4js-api 的 Configuration Object 段中,竟然看到了下面的內容:app

pm2 (boolean) (optional)
set this to true if you’re running your app using pm2, otherwise logs will not work (you’ll also need to install pm2-intercom)
原來還有這個配置,並且不開啓的話就會工做不正常?可是我以前在測試服務器的時候工做得好好的啊~測試

對比了一下部署環境,原來生產環境下使用了 cluster 模式,可是在測試環境中只啓動一個進程因此用了 fork 模式,在生產環境切換到 fork 果真就正常了~ui

解決辦法,經過變量指定了一下部署環境,在生產環境對 log4js 對配置添加 pm2: true 的選項。this

示例(我是經過 NODE_ENV === 'production' 進行判斷):debug

const log4js = require('log4js');調試

log4js.configure({
appenders: {
out: { type: 'stdout' },
app: { type: 'file', filename: 'application.log' }
},
categories: {
default: { appenders: [ 'out', 'app' ], level: 'debug' }
}
pm2: process.env.NODE_ENV === 'production',
});

module.exports = log4js;

可是對於後面說的 pm2-intercom 模塊,我測試中就是沒有安裝也能夠正常工做,看了一下這個模塊,是一個內部進程通信的模塊:

Simple inter process communication for processes managed by PM2. Require PM2 > 16.0.0.
我估計是 log4js 用在多個 cluster 進程中協調文件日誌的吧。

因而可知,認真看文檔很重要,認真看文檔很重要,認真看文檔很重要!!!

原文連接:https://blog.yourtion.com/fix-log4js-with-pm2-not-work.html

相關文章
相關標籤/搜索