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

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

NestJS

概要

NestJS のログにリクエスト情報を追加します。

デバック時にどんなクエリで不具合が起きているのか確認をする際、ログからリクエスト情報を参照出来るので便利です。

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

実装方法

LoggerMiddleware を実装

NestJSの Middlewareはルートハンドラーの前に呼び出される関数です。コントローラーのエンドポイントへの処理前に特定の処理を挟めます。

今回は そのMiddlewareを用いて、リクエスト毎にリクエスト情報をログに出力するようにします。

1import { Injectable, Logger, NestMiddleware } from '@nestjs/common';
2import { Request, Response } from 'express';
3
4@Injectable()
5export class LoggerMiddleware implements NestMiddleware {
6 private readonly logger = new Logger(LoggerMiddleware.name);
7
8 use(req: Request, _: Response, next: () => void): void {
9 this.logger.log(this.createMessage(req));
10 next();
11 }
12
13 private createMessage(req: Request): string {
14 const { body } = req;
15
16 const msg = `api request [url=${req.url}, method=${
17 req.method
18 }, body=${JSON.stringify(body)}, ip=${req.ip}]`;
19 return msg;
20 }
21}
22

NestJSの MiddlewareはRequestを取得出来るので、その情報を元に今回はmethod, body, clientIp を出力するようにしています。

AppModuleにLoggerMiddlewareを設定

AppModuleに先ほど実装した LoogerMiddlewareを設定します。これでリクエストの度にLoogerMiddlewareが呼び出されるはずです。

1export class AppModule {
2 configure(consumer: MiddlewareConsumer): void {
3 consumer.apply(LoggerMiddleware).forRoutes('');
4 }
5}

実行結果

以下のようにエンドポイントを叩くと、method, body, clientIp が出力されていれば成功です!

1[Nest] 98030  - 2021/10/30 22:23:55     LOG [LoggerMiddleware] api request [url=/sample, method=GET, body={}, ip=::1]

まとめ

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

ただ、本番環境で上記ログを出すとパスワードといった情報も出てしまうので、以下のようにマスクをする処理を挟む必要があるかもです。(もう少し良いやり方ありそう)

1const { body } = req;
2const nextBody = { ...body };
3if ('password' in nextBody) {
4 nextBody.password = '********';
5}