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が出力される設定で設定し直している
最近一個のサーバーでずっと動かしてるというより、コンテナとかでポンポン作るので起動時のログを素直に抑制できるオプションとか入れてくれないかな…