ブログトップ画像

NestJS で LogにStack情報を追加する

バックエンド

概要

NestJS のログにスタック情報を追加します。

デバック時にどこで落ちているか確認をする際、ログからスタック情報を参照出来るのと便利です。

なお、今回はNestJS の環境が構築されている前提でご説明します。

実装方法

HttpExceptionsFilter を実装

NestJSの Exception filtersは例外処理をキャッチし、その例外処理にカスタムの機能を追加することができます。

今回は その Exception filtersを用いて、例外が発生する度にスタック情報をログに出力するようにします。

import { ArgumentsHost, Catch, HttpException, Logger } from '@nestjs/common';
import { BaseExceptionFilter } from '@nestjs/core';

@Catch(HttpException)
export class HttpExceptionsFilter extends BaseExceptionFilter {
  private readonly logger = new Logger(HttpExceptionsFilter.name);

  catch(exception: HttpException, host: ArgumentsHost): void {
    super.catch(exception, host);
    const status = exception.getStatus();

    if (status >= 500) {
      this.logger.error(exception.stack);
    } else {
      this.logger.warn(exception.stack);
    }
  }
}


exceptionにはエラー情報が含まれます。その情報にスタックが含まれるので、それをログに出力するようにしています。ステータスが500以下は重要度的にもLogLevelをwarnにしています。

MainにHttpExceptionsFilterを設定

HttpExceptionsFilter をグローバルに適用するようにします。

const { httpAdapter } = app.get(HttpAdapterHost);
app.useGlobalFilters(new HttpExceptionsFilter(httpAdapter));


実行結果

以下のようにエラー発生すると以下のログが出力されていれば成功です!

[Nest] 2513  - 2021/10/31 14:31:08    WARN [HttpExceptionsFilter] UnauthorizedException: Unauthorized
... エラー箇所のスタック


まとめ

NestJS のログにスタック情報を追加する方法をご紹介しました。デバックが楽になるので良かったら追加してみてください。