2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【NestJS】interceptor(インターセプター)でコントローラーの最初と最後にログを仕込む

Last updated at Posted at 2024-11-05

経緯

NestJSをバックエンドAPIとして利用しているのですが、
あるフロントの1ページにアクセスした際にたくさんのデータ取得用apiが叩かれるため、各APIのコントローラーで
「SQLログを出しているけど、どのAPI内で実行されているか」
「各APIでどれくらいの時間がかかっているのか」
が少しわかりづらいなあと感じつつ、それぞれログを仕込んでいました。

調べてみると、NestJSにはinterceptorという機能があり、それを使えば全てのコントローラーの最初、最後に統一した処理を追加できるので、公式にある処理ほぼそのままですが試してみました。
※Laravelのミドルウェアのようなイメージです。

手順

logging.interceptor.tsというファイルを作成します。

import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';

@Injectable()
class LoggingInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    // リクエストオブジェクトを取得
    const request = context.switchToHttp().getRequest();

    // コントローラーのメタデータを取得
    const handler = context.getHandler();
    const controller = context.getClass().name;

    const { method, url } = request;
    const now = Date.now();

    console.log(`--- コントローラー呼び出し開始 ---`);
    console.log(`Controller: ${controller}`);
    console.log(`Method: ${method}`);
    console.log(`URL: ${url}`);
    console.log(`Timestamp: ${new Date().toISOString()}`);

    return next.handle().pipe(
      tap(() => {
        const duration = Date.now() - now;
        console.log(`--- コントローラー呼び出し終了 ---`);
        console.log(`Duration: ${duration}ms`);
      }),
    );
  }
}

main.tsuseGlobalInterceptorsとして読み込みます。

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { LoggingInterceptor } from './logging.interceptor';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalInterceptors(new LoggingInterceptor()); //ここ
  await app.listen(3000);
}
bootstrap();

結果(Dockerのログです。。モザイク部分はsqlなので割愛)
スクリーンショット_2024-11-05_12_50_35_png.png

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?