@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
JavaScript
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