背景
node.js/expressはシングルスレッドで動作するため、パフォーマンスを上げるためには、pm2等ででクラスタリングする必要があります。
しかしながら、log4jsではクラスタリングするとログを出力しない問題があります。
その場合、「.pm2/logs/pm2-intercom-error.log」には、以下のような「pm2.disconnectBus is not a function」というエラーが出力されている場合があります。
TypeError: pm2.disconnectBus is not a function
at exit (/home/aaaaaa/.pm2/modules/pm2-intercom/node_modules/pm2-intercom/lib/index.js:146:7)
at process.<anonymous> (/home/aaaaaa/.pm2/modules/pm2-intercom/node_modules/pm2-intercom/lib/index.js:153:3)
at process.emit (node:events:513:28)
at process.emit (node:domain:489:12)
対策
まずはlog4jsの設定です。
pm2-intercom をインストールしてプロセス間通信を行うようにします。
pm2 install pm2-intercom
log4js.configure({
appenders: { out: { type: "stdout" } },
categories: { default: { appenders: ["out"], level: "info" } },
pm2: true,
});
公式には「pm2InstanceVar」がありますが入れない。
次に、pm2では、Graceful start を有効にします。
pm2 start app.js --wait-ready --listen-timeout 10000
ymlで設定する場合は以下のような感じ
apps:
- script: ./bin/www
name: 'MYAPP'
exec_mode: 'cluster'
instances: max
log_date_format: 'YYYY-MM-DD HH:mm Z'
instance_var: 'MYAPP'
wait_ready: true,
listen_timeout: 10000
env_production:
NODE_ENV: production
以上。
公式の通りにやっても動作しなかったため少し詰まりました。参考までに残しておきます。
参考文献
log4js-node/docs/clustering.md at master · log4js-node/log4js-node
A port of log4js to node.js. Contribute to log4js-node/log4js-node development by creating an account on GitHub.
Attention Required! | Cloudflare
PM2 - Graceful Start/Shutdown
Advanced process manager for production Node.js applications. Load balancer, logs facility, startup script, micro service management, at a glance.
コメント