UNPKG

@pulzar/core

Version:

Next-generation Node.js framework for ultra-fast web applications with zero-reflection DI, GraphQL, WebSockets, events, and edge runtime support

72 lines 2.72 kB
import { logger } from "../utils/logger"; export function createLoggerMiddleware(options = {}) { const defaultOptions = { includeHeaders: false, includeBody: false, includeQuery: true, excludePaths: ["/health", "/ping", "/metrics"], }; const loggingOptions = { ...defaultOptions, ...options }; const requestTimes = new WeakMap(); return { preHandler: async (request, reply) => { const startTime = Date.now(); requestTimes.set(request, startTime); const { method, url, ip } = request; // Skip logging for excluded paths if (loggingOptions.excludePaths?.some((path) => url.startsWith(path))) { return; } // Log request const requestLog = { method, url, ip, userAgent: request.headers["user-agent"], }; if (loggingOptions.includeQuery && Object.keys(request.query || {}).length > 0) { requestLog.query = request.query; } if (loggingOptions.includeHeaders) { requestLog.headers = request.headers; } if (loggingOptions.includeBody && request.body) { requestLog.body = request.body; } logger.info("HTTP Request", requestLog); }, onSend: async (request, reply, payload) => { const startTime = requestTimes.get(request); if (!startTime) return payload; const { method, url } = request; // Skip logging for excluded paths if (loggingOptions.excludePaths?.some((path) => url.startsWith(path))) { return payload; } const duration = Date.now() - startTime; const responseLog = { method, url, statusCode: reply.statusCode, duration: `${duration}ms`, contentLength: reply.getHeader("content-length") || 0, }; if (reply.statusCode >= 400) { logger.error("HTTP Response Error", responseLog); } else { logger.info("HTTP Response", responseLog); } return payload; }, }; } export function registerLoggerPlugin(fastify, options = {}) { const loggerHooks = createLoggerMiddleware(options); fastify.addHook("preHandler", loggerHooks.preHandler); fastify.addHook("onSend", loggerHooks.onSend); } export const loggerMiddleware = createLoggerMiddleware(); //# sourceMappingURL=logger.middleware.js.map