import { createHash } from "node:crypto"; import { Injectable, Logger, NestMiddleware } from "@nestjs/common"; import { NextFunction, Request, Response } from "express"; @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 as string).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(); } }