import { Injectable, NestMiddleware, Logger } from "@nestjs/common"; import { Request, Response, NextFunction } from "express"; import { MetricsService } from "./metrics.service"; @Injectable() export class RequestLoggerMiddleware implements NestMiddleware { private readonly logger = new Logger(RequestLoggerMiddleware.name); constructor(private readonly metricsService: MetricsService) {} use(req: Request, res: Response, next: NextFunction) { const start = Date.now(); const { method, originalUrl } = req; res.on("finish", () => { const responseTime = Date.now() - start; const statusCode = res.statusCode; this.metricsService.recordRequest( method, originalUrl, statusCode, responseTime, ); this.logger.debug( `${method} ${originalUrl} ${statusCode} ${responseTime}ms`, ); }); next(); } }