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(); + } +}