NestJSのExceptionFiltersでいい感じに例外処理とログ出力を実現する方法

16.1K Views

March 31, 23

スライド概要

NestJSのExceptionFiltersでいい感じに例外処理とログ出力を実現する方法

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

NestJSの ExceptionFiltersでいい 感じに例外処理とログ出 力を実現する方法 ampersand 2023.03.31

2.

自己紹介 フロントもバックエンドもTypescriptで書いてます。 新規事業が得意なエンジニアです。 よろしくお願いします。 twitter:https://twitter.com/ampersand000 blog:https://blog.ampersand.today/ zenn:https://zenn.dev/ampersand

3.

zennに記事あげてます https://zenn.dev/ampersand/articles/9b1623e5860b57

4.

ExceptionFiltersについて-1 ・NestJS の ExceptionFilters は、アプリケーションで発生した例 外を捕捉し、処理するための仕組みです。 ・ExceptionFilters を使用すると、発生した例外に基づいてカスタ ムなエラーレスポンスを返すことができます。 ・これにより、エラー処理のロジックを一元化し、コードの整理と 保守性を向上させることができます。

5.

ExceptionFiltersについて-2 コード例

6.

Loggerについて-1 ・NestJSは、内部的にLoggerを使用してアプリケーションの実行時に 様々な情報をログに記録します。 ・NestJSのデフォルトLoggerは、コンソールにログを出力するシンプル なものです。 ・カスタムLoggerを実装することで、アプリケーションのログをより柔軟 に制御することができます。

7.

Loggerについて-2 コード例

8.

実装の概要 例外の発生を検知したら ・ログファイルにエラーを記録する ・エラーのレスポンスを返す ようにします。 正直、main.tsにグローバルフィルターとして登録したかったのです が、イマイチうまくいかないので、moduleごとにDIする方針でいきます。

9.

実装の構成 src/moduleの配下に、exceptionとloggingディレクトリを配置し ます。 その後以下のファイルを作成します。 exception/all-exception.filter.ts exception/exception.module.ts logging/logging.service.ts logging/logging.module.ts

10.

モジュールについて-1 ・モジュール(Module)は、NestJSアプリケーションの基本的な構 成要素です。 ・モジュールは、関連する機能や機能群をまとめた単位です。 ・アプリケーション全体を機能ごとに分割して、再利用可能でメン テナンスしやすいコードを作成することができます。

11.

モジュールについて-2 ・モジュールを使用することで、NestJSアプリケーションの構造と 整理が容易になり、より効率的な開発が可能になります。 ・モジュールは、アプリケーションが成長するにつれて、機能を追 加しやすくすることをサポートします。

12.

モジュールの実装

13.

LoggingServiceの実装-1 NestJSが提供しているLoggerServiceインターフェースからカスタ ムロガーを実装していきます

14.

LoggingServiceの実装-2 まずはコンストラクターに実装していきます。 ロギングライブラリにwinstonを使用しています。 ログの出力フォー マットを定義 ログの出力を定義 本番環境以外の場 合コンソールにログ を出力 winstonを使用して ロガーを作成

15.

LoggingServiceの実装-3 winston ロギングライブラリのログフォーマットを定義します。 タイムスタンプと出力フォーマットを定義しています。

16.

LoggingServiceの実装-4 ログファイルが20mByteを超えたら、もしくは32日を超えたら ローテションします

17.

LoggingServiceの実装-5 コンソールに出力するログ コンソールに出力するログの表示形式を指定します。

18.

LoggingServiceの実装-6 メソッドを実装していきます。 いつ、どこで、だれが、何のエラーを発生させたかがわかるよう に意識したログにしてあります。

19.

ExceptionFilterの実装-1 NestJSが提供している ExceptionFilterインターフェー スからカスタム例外を実装して いきます。 @Catch()ですべての例外を キャッチします。

20.

ExceptionFilterの実装-2 Fastyを使用している場 合、Rsoponseに修正が 必要です。 <FastifyReply>が必要 .jsonではなく、.send

21.

ExceptionFilterの実装-3 ロギングとレスポンスのための変数を設定しています。

22.

ExceptionFilterの実装-4 ログ出力してレスポンスを返します。 ログにはスタックトレースを出力し、 レスポンスはメッセージのみ表示します。

23.

実際に使ってみる 使いたいモジュールの importsに ExceptionModuleを追 加します。 今回は住所モジュールで 使ってみます

24.

実際に使ってみる テストを動かしてthrow new Error("住所が見つかりません");を 発生させます。

25.

実際に使ってみる コンソール コンソール上にエラーが表示されました。 同様にエラーファイルにエラーが出力され ました。 error-yyyy-mm-dd.log

26.

ご清聴ありがとうございました。 このように、カスタム例外を作成し、その中でログ出力をすること で、エラーの発生を検知したら同時にいい感じにエラーをログに 出力することができます。