From 3999f84efff9578a2b63ff08fbf7be03ead1ad7b Mon Sep 17 00:00:00 2001 From: Morgan <33722304+ThyMinimalDev@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:19:31 +0300 Subject: [PATCH] chore: better request/response logging apiv2 (#17210) * chore: better request/response logging apiv2 * fixup! chore: better request/response logging apiv2 --- .../request-ids/request-id.interceptor.ts | 28 +++++++++++++++++-- .../request-ids/request-id.middleware.ts | 21 ++++++++++++-- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/apps/api/v2/src/middleware/request-ids/request-id.interceptor.ts b/apps/api/v2/src/middleware/request-ids/request-id.interceptor.ts index b49d75d456..1905327de9 100644 --- a/apps/api/v2/src/middleware/request-ids/request-id.interceptor.ts +++ b/apps/api/v2/src/middleware/request-ids/request-id.interceptor.ts @@ -1,8 +1,11 @@ -import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from "@nestjs/common"; +import { CallHandler, ExecutionContext, Injectable, NestInterceptor, Logger } from "@nestjs/common"; import { Request, Response } from "express"; +import { tap } from "rxjs/operators"; @Injectable() export class ResponseInterceptor implements NestInterceptor { + private readonly logger = new Logger("ResponseInterceptor - NestInterceptor"); + intercept(context: ExecutionContext, next: CallHandler) { const ctx = context.switchToHttp(); const request = ctx.getRequest(); @@ -10,7 +13,28 @@ export class ResponseInterceptor implements NestInterceptor { const requestId = request.headers["X-Request-Id"] ?? "unknown-request-id"; response.setHeader("X-Request-Id", requestId.toString()); + const { method, url } = request; + const startTime = Date.now(); - return next.handle(); + return next.handle().pipe( + tap((data) => { + const { statusCode } = response; + const responseTime = Date.now() - startTime; + + // Log response in JSON format + this.logger.log( + JSON.stringify({ + requestId, + method, + url, + statusCode, + responseTime, + responseBody: data, + timestamp: new Date().toISOString(), + message: "Outgoing Response", + }) + ); + }) + ); } } diff --git a/apps/api/v2/src/middleware/request-ids/request-id.middleware.ts b/apps/api/v2/src/middleware/request-ids/request-id.middleware.ts index 2902dd8fb2..43c53c5bee 100644 --- a/apps/api/v2/src/middleware/request-ids/request-id.middleware.ts +++ b/apps/api/v2/src/middleware/request-ids/request-id.middleware.ts @@ -1,11 +1,28 @@ -import { Injectable, NestMiddleware } from "@nestjs/common"; +import { Injectable, NestMiddleware, Logger } from "@nestjs/common"; import { Request, Response, NextFunction } from "express"; import { v4 as uuid } from "uuid"; @Injectable() export class RequestIdMiddleware implements NestMiddleware { + private readonly logger = new Logger("RequestIdMiddleware - NestMiddleware"); + use(req: Request, res: Response, next: NextFunction) { - req.headers["X-Request-Id"] = uuid(); + const requestId = uuid(); + req.headers["X-Request-Id"] = requestId; + const { method, headers, body: requestBody, baseUrl } = req; + + this.logger.log( + JSON.stringify({ + requestId, + method, + url: baseUrl, + headers, + requestBody, + timestamp: new Date().toISOString(), + message: "Incoming Request", + }) + ); + next(); } }