ゆずめも

メモ的なブログです。主に勉強した事について書いてます。

nest.jsの起動時のログを止める

github.com

tl;dr

  • 一旦LogLevelの設定でlogをなくす
  • 起動後Loggerの設定を上書きする

きっかけ

最近nest.jsを使っていて、serverless環境で動かす時にgoのechoだとできたんだけど、起動時のログ出るのなんとか抑制できないかなーと思って結構無理やりっぽくなったので誰かいい方法知ってたら教えてほしい

yuzu441.hateblo.jp

やりたいこと

  • 起動時の初期化ログの抑制
    • ただしerrorやwarnは出したい
  • 開発環境であればログは全部出す

実現方法

nestjsの型定義などを見てみたが、どうもそういうオプションはなさそうだった。

nestのプロジェクトを作成するとできるmain.tsに以下の変更を加える

const productionLoggerLevel = ['error', 'warn', 'log'] as LogLevel[]
async function bootstrap() {
  const isProd = process.env.NODE_ENV === 'production'

  const app = await NestFactory.create(
    AppModule,
    {
      logger: isProd ? ['error', 'warn'] : undefined,
    }
  )

  const port = process.env['PORT'] ?? 3000
  await app.listen(+port).then(() => {
    Logger.debug(`Server listen port ${port}`)
    isProd && Logger.overrideLogger(productionLoggerLevel)
  })
}

ここで重要なのはNestFactory.createproduction環境であれば['error', 'warn']だけをloggerに設定していて、listenのcallback内でLogger.overrideLogger(productionLoggerLevel)で再度上書きしている所

まとめ

nest.jsの初期化の処理を追っているとcreateの時にLoggerの設定を行っていてfalseを渡すとoverrideLoggerでLogger instanceをundefinedで上書きしているけど、LogLevelを設定するだけであればLoggerのインスタンスは上書きされない事がわかったので、一旦logを抜いたLogLevelを設定して、再度logが出力される設定で設定し直している

github.com

最近一個のサーバーでずっと動かしてるというより、コンテナとかでポンポン作るので起動時のログを素直に抑制できるオプションとか入れてくれないかな…