21.2K Views
March 31, 23
スライド概要
NestJSのExceptionFiltersでいい感じに例外処理とログ出力を実現する方法
NestJSの ExceptionFiltersでいい 感じに例外処理とログ出 力を実現する方法 ampersand 2023.03.31
自己紹介 フロントもバックエンドもTypescriptで書いてます。 新規事業が得意なエンジニアです。 よろしくお願いします。 twitter:https://twitter.com/ampersand000 blog:https://blog.ampersand.today/ zenn:https://zenn.dev/ampersand
zennに記事あげてます https://zenn.dev/ampersand/articles/9b1623e5860b57
ExceptionFiltersについて-1 ・NestJS の ExceptionFilters は、アプリケーションで発生した例 外を捕捉し、処理するための仕組みです。 ・ExceptionFilters を使用すると、発生した例外に基づいてカスタ ムなエラーレスポンスを返すことができます。 ・これにより、エラー処理のロジックを一元化し、コードの整理と 保守性を向上させることができます。
ExceptionFiltersについて-2 コード例
Loggerについて-1 ・NestJSは、内部的にLoggerを使用してアプリケーションの実行時に 様々な情報をログに記録します。 ・NestJSのデフォルトLoggerは、コンソールにログを出力するシンプル なものです。 ・カスタムLoggerを実装することで、アプリケーションのログをより柔軟 に制御することができます。
Loggerについて-2 コード例
実装の概要 例外の発生を検知したら ・ログファイルにエラーを記録する ・エラーのレスポンスを返す ようにします。 正直、main.tsにグローバルフィルターとして登録したかったのです が、イマイチうまくいかないので、moduleごとにDIする方針でいきます。
実装の構成 src/moduleの配下に、exceptionとloggingディレクトリを配置し ます。 その後以下のファイルを作成します。 exception/all-exception.filter.ts exception/exception.module.ts logging/logging.service.ts logging/logging.module.ts
モジュールについて-1 ・モジュール(Module)は、NestJSアプリケーションの基本的な構 成要素です。 ・モジュールは、関連する機能や機能群をまとめた単位です。 ・アプリケーション全体を機能ごとに分割して、再利用可能でメン テナンスしやすいコードを作成することができます。
モジュールについて-2 ・モジュールを使用することで、NestJSアプリケーションの構造と 整理が容易になり、より効率的な開発が可能になります。 ・モジュールは、アプリケーションが成長するにつれて、機能を追 加しやすくすることをサポートします。
モジュールの実装
LoggingServiceの実装-1 NestJSが提供しているLoggerServiceインターフェースからカスタ ムロガーを実装していきます
LoggingServiceの実装-2 まずはコンストラクターに実装していきます。 ロギングライブラリにwinstonを使用しています。 ログの出力フォー マットを定義 ログの出力を定義 本番環境以外の場 合コンソールにログ を出力 winstonを使用して ロガーを作成
LoggingServiceの実装-3 winston ロギングライブラリのログフォーマットを定義します。 タイムスタンプと出力フォーマットを定義しています。
LoggingServiceの実装-4 ログファイルが20mByteを超えたら、もしくは32日を超えたら ローテションします
LoggingServiceの実装-5 コンソールに出力するログ コンソールに出力するログの表示形式を指定します。
LoggingServiceの実装-6 メソッドを実装していきます。 いつ、どこで、だれが、何のエラーを発生させたかがわかるよう に意識したログにしてあります。
ExceptionFilterの実装-1 NestJSが提供している ExceptionFilterインターフェー スからカスタム例外を実装して いきます。 @Catch()ですべての例外を キャッチします。
ExceptionFilterの実装-2 Fastyを使用している場 合、Rsoponseに修正が 必要です。 <FastifyReply>が必要 .jsonではなく、.send
ExceptionFilterの実装-3 ロギングとレスポンスのための変数を設定しています。
ExceptionFilterの実装-4 ログ出力してレスポンスを返します。 ログにはスタックトレースを出力し、 レスポンスはメッセージのみ表示します。
実際に使ってみる 使いたいモジュールの importsに ExceptionModuleを追 加します。 今回は住所モジュールで 使ってみます
実際に使ってみる テストを動かしてthrow new Error("住所が見つかりません");を 発生させます。
実際に使ってみる コンソール コンソール上にエラーが表示されました。 同様にエラーファイルにエラーが出力され ました。 error-yyyy-mm-dd.log
ご清聴ありがとうございました。 このように、カスタム例外を作成し、その中でログ出力をすること で、エラーの発生を検知したら同時にいい感じにエラーをログに 出力することができます。