@httpc/kit
Version:
httpc toolbox for building function-based API with minimal code and end-to-end type safety
64 lines (63 loc) • 2.36 kB
JavaScript
import { performance } from "perf_hooks";
import { useContext } from "@httpc/server";
import { useLogger } from "./context";
const PRESET = {
defaults: {
logBegin: true,
logParameters: false,
logRequestId: false,
logResult: false,
},
development: {
logBegin: true,
logParameters: true,
logRequestId: false,
logResult: false,
},
production: {
logBegin: false,
logParameters: false,
logRequestId: false,
logResult: false,
}
};
export function RequestLoggerMiddleware(options) {
const preset = PRESET[process.env.NODE_ENV || ""] || PRESET.defaults;
const { logBegin, logParameters, logRequestId, logResult, } = { ...preset, ...options };
function writeBegin(logger, requestId, call) {
requestId = logRequestId ? `(${requestId})` : "";
logger.verbose("Request%s:begin > /%s", requestId, call.path);
if (logParameters) {
logger.debug("Request%s:params > /%s %o", requestId, call.path, call.params);
}
}
function writeEnd(logger, requestId, call, begin, result) {
requestId = logRequestId ? `(${requestId})` : "";
const duration = (performance.now() - begin).toFixed(0);
const level = result && result instanceof Error ? "error" : "info";
if (level === "info") {
logger.info("Request%s:end > /%s(%dms)", requestId, call.path, duration);
if (logResult) {
logger.debug(level, "Request%s:result > /%s(%dms) %o", requestId, call.path, duration, result);
}
}
else if (level === "error") {
logger.error("Request%s:end > /%s(%dms) %o", requestId, call.path, duration, result);
}
}
return async (call, next) => {
const { requestId } = useContext();
const logger = useLogger();
const timestamp = performance.now();
if (logBegin) {
writeBegin(logger, requestId, call);
}
return await next(call).then(result => {
writeEnd(logger, requestId, call, timestamp, result);
return result;
}, error => {
writeEnd(logger, requestId, call, timestamp, error);
throw error;
});
};
}