node.js/express/log4js/pm2の環境でログを出力する

背景

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.

コメント

タイトルとURLをコピーしました