NestJS で LogにRequest情報を追加する
バックエンド概要
NestJS のログにリクエスト情報を追加します。
デバック時にどんなクエリで不具合が起きているのか確認をする際、ログからリクエスト情報を参照出来るので便利です。
なお、今回はNestJS の環境が構築されている前提でご説明します。
実装方法
LoggerMiddleware を実装
NestJSの Middlewareはルートハンドラーの前に呼び出される関数です。コントローラーのエンドポイントへの処理前に特定の処理を挟めます。
今回は そのMiddlewareを用いて、リクエスト毎にリクエスト情報をログに出力するようにします。
import { Injectable, Logger, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
private readonly logger = new Logger(LoggerMiddleware.name);
use(req: Request, _: Response, next: () => void): void {
this.logger.log(this.createMessage(req));
next();
}
private createMessage(req: Request): string {
const { body } = req;
const msg = `api request [url=${req.url}, method=${
req.method
}, body=${JSON.stringify(body)}, ip=${req.ip}]`;
return msg;
}
}
NestJSの MiddlewareはRequestを取得出来るので、その情報を元に今回はmethod
, body
, clientIp
を出力するようにしています。
AppModuleにLoggerMiddlewareを設定
AppModule
に先ほど実装した LoogerMiddleware
を設定します。これでリクエストの度にLoogerMiddleware
が呼び出されるはずです。
export class AppModule {
configure(consumer: MiddlewareConsumer): void {
consumer.apply(LoggerMiddleware).forRoutes('');
}
}
実行結果
以下のようにエンドポイントを叩くと、method
, body
, clientIp
が出力されていれば成功です!
[Nest] 98030 - 2021/10/30 22:23:55 LOG [LoggerMiddleware] api request [url=/sample, method=GET, body={}, ip=::1]
まとめ
NestJS のログにリクエスト情報を追加する方法をご紹介しました。デバックが楽になるかもなので良かったら追加してみてください。
ただ、本番環境で上記ログを出すとパスワードといった情報も出てしまうので、以下のようにマスクをする処理を挟む必要があるかもです。(もう少し良いやり方ありそう)
const { body } = req;
const nextBody = { ...body };
if ('password' in nextBody) {
nextBody.password = '********';
}