From 41e5925bdb0caac05b3089525848cc08e81f5f4c Mon Sep 17 00:00:00 2001 From: KGFCH2 Date: Sun, 31 May 2026 21:21:13 +0530 Subject: [PATCH] feat: add standardized request logging middleware with latency tracking --- server/app.js | 3 +++ server/middlewares/logger.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 server/middlewares/logger.js diff --git a/server/app.js b/server/app.js index f9ee853..ac5baeb 100644 --- a/server/app.js +++ b/server/app.js @@ -1,5 +1,6 @@ import express from 'express'; import cors from "cors"; +import logger from "./middlewares/logger.js"; import errorHandler from "./middlewares/errorHandler.js"; import authRoutes from "./modules/auth/routes.js"; import userRoutes from "./modules/user/routes.js"; @@ -9,6 +10,8 @@ import githubRoutes from "./modules/github/routes.js"; const app = express(); +app.use(logger); + const allowedOrigins = [ process.env.CLIENT_URL, process.env.CLIENT_URI, diff --git a/server/middlewares/logger.js b/server/middlewares/logger.js new file mode 100644 index 0000000..1a84cc4 --- /dev/null +++ b/server/middlewares/logger.js @@ -0,0 +1,28 @@ +/** + * HTTP request logger middleware. + * Logs method, URL, status code, execution duration, and IP. + */ +export const logger = (req, res, next) => { + const start = Date.now(); + const { method, originalUrl, ip } = req; + + // Wait for the response to finish before logging + res.on('finish', () => { + const duration = Date.now() - start; + const { statusCode } = res; + + let statusColor = "\x1b[32m"; // green for 2xx + if (statusCode >= 400) statusColor = "\x1b[31m"; // red for 4xx/5xx + else if (statusCode >= 300) statusColor = "\x1b[33m"; // yellow for 3xx + + const resetColor = "\x1b[0m"; + + console.log( + `[${new Date().toISOString()}] ${method} ${originalUrl} - ${statusColor}${statusCode}${resetColor} (${duration}ms) - IP: ${ip}` + ); + }); + + next(); +}; + +export default logger;