|
1 | | -import { Injectable, Logger, NestMiddleware } from '@nestjs/common'; |
2 | | -import { Request, Response, NextFunction } from 'express'; |
| 1 | +import { Injectable, Logger, NestMiddleware } from "@nestjs/common"; |
| 2 | +import { Request, Response, NextFunction } from "express"; |
| 3 | +import { randomUUID } from "crypto"; |
| 4 | + |
| 5 | +declare global { |
| 6 | + namespace Express { |
| 7 | + interface Request { |
| 8 | + requestId?: string; |
| 9 | + startTime?: number; |
| 10 | + } |
| 11 | + } |
| 12 | +} |
3 | 13 |
|
4 | 14 | @Injectable() |
5 | 15 | export class LoggerMiddleware implements NestMiddleware { |
6 | | - private logger = new Logger('HTTP'); |
| 16 | + private logger = new Logger("HTTP"); |
| 17 | + |
| 18 | + use(request: Request, response: Response, next: NextFunction): void { |
| 19 | + const startTime = Date.now(); |
| 20 | + const { ip, method, originalUrl } = request; |
| 21 | + const userAgent = request.get("user-agent") || ""; |
7 | 22 |
|
8 | | - use(request: Request, response: Response, next: NextFunction): void { |
9 | | - const { ip, method, originalUrl } = request; |
10 | | - const userAgent = request.get('user-agent') || ''; |
| 23 | + // Generate or use existing request ID |
| 24 | + const requestId = |
| 25 | + (request.headers["x-request-id"] as string) || randomUUID(); |
11 | 26 |
|
12 | | - response.on('finish', () => { |
13 | | - const { statusCode } = response; |
14 | | - const contentLength = response.get('content-length'); |
| 27 | + // Attach to request for use in exception filters and services |
| 28 | + request.requestId = requestId; |
| 29 | + request.startTime = startTime; |
| 30 | + request.headers["x-request-id"] = requestId; |
| 31 | + response.setHeader("x-request-id", requestId); |
15 | 32 |
|
16 | | - this.logger.log( |
17 | | - `${method} ${originalUrl} ${statusCode} ${contentLength} - ${userAgent} ${ip}`, |
18 | | - ); |
19 | | - }); |
| 33 | + response.on("finish", () => { |
| 34 | + const { statusCode } = response; |
| 35 | + const contentLength = response.get("content-length") || 0; |
| 36 | + const responseTime = Date.now() - startTime; |
20 | 37 |
|
21 | | - next(); |
22 | | - } |
23 | | -} |
| 38 | + this.logger.log( |
| 39 | + `${method} ${originalUrl} ${statusCode} ${contentLength} ${responseTime}ms - ${userAgent} ${ip}` |
| 40 | + ); |
| 41 | + }); |
24 | 42 |
|
| 43 | + next(); |
| 44 | + } |
| 45 | +} |
0 commit comments