nest.jsの起動時のログを止める
tl;dr
- 一旦LogLevelの設定で
log
をなくす - 起動後Loggerの設定を上書きする
きっかけ
最近nest.jsを使っていて、serverless環境で動かす時にgoのechoだとできたんだけど、起動時のログ出るのなんとか抑制できないかなーと思って結構無理やりっぽくなったので誰かいい方法知ってたら教えてほしい
やりたいこと
- 起動時の初期化ログの抑制
- ただし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.create
でproduction
環境であれば['error', 'warn']
だけをloggerに設定していて、listen
のcallback内でLogger.overrideLogger(productionLoggerLevel)
で再度上書きしている所
まとめ
nest.jsの初期化の処理を追っているとcreate
の時にLoggerの設定を行っていてfalse
を渡すとoverrideLogger
でLogger instanceをundefinedで上書きしているけど、LogLevelを設定するだけであればLoggerのインスタンスは上書きされない事がわかったので、一旦log
を抜いたLogLevelを設定して、再度log
が出力される設定で設定し直している
最近一個のサーバーでずっと動かしてるというより、コンテナとかでポンポン作るので起動時のログを素直に抑制できるオプションとか入れてくれないかな…