From edc1ab2438c1f25bfb2f64044a438e9e028b8d82 Mon Sep 17 00:00:00 2001 From: Mathis HERRIOT <197931332+0x485254@users.noreply.github.com> Date: Tue, 20 Jan 2026 09:45:06 +0100 Subject: [PATCH] feat(logging): introduce HTTP logging middleware Add middleware to log HTTP request and response details, including method, URL, status, duration, user agent, and hashed IP address. Logs categorized by severity based on response status code. --- .../middlewares/http-logger.middleware.ts | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 backend/src/common/middlewares/http-logger.middleware.ts diff --git a/backend/src/common/middlewares/http-logger.middleware.ts b/backend/src/common/middlewares/http-logger.middleware.ts new file mode 100644 index 0000000..bebb492 --- /dev/null +++ b/backend/src/common/middlewares/http-logger.middleware.ts @@ -0,0 +1,35 @@ +import { Injectable, Logger, NestMiddleware } from "@nestjs/common"; +import { NextFunction, Request, Response } from "express"; +import { createHash } from "node:crypto"; + +@Injectable() +export class HTTPLoggerMiddleware implements NestMiddleware { + private readonly logger = new Logger("HTTP"); + + use(request: Request, response: Response, next: NextFunction): void { + const { method, originalUrl, ip } = request; + const userAgent = request.get("user-agent") || ""; + const startTime = Date.now(); + + response.on("finish", () => { + const { statusCode } = response; + const contentLength = response.get("content-length"); + const duration = Date.now() - startTime; + + const hashedIp = createHash("sha256").update(ip).digest("hex"); + const message = `${method} ${originalUrl} ${statusCode} ${contentLength || 0} - ${userAgent} ${hashedIp} +${duration}ms`; + + if (statusCode >= 500) { + return this.logger.error(message); + } + + if (statusCode >= 400) { + return this.logger.warn(message); + } + + return this.logger.log(message); + }); + + next(); + } +}