@fofmbarros/express-logger
Version:
Plug and play Express.js request and response middleware
106 lines (105 loc) • 3.4 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var index_exports = {};
__export(index_exports, {
default: () => index_default
});
module.exports = __toCommonJS(index_exports);
var import_fast_xml_parser = require("fast-xml-parser");
var import_node_crypto = require("crypto");
var parseBody = (body, contentType) => {
if (typeof body === "object" || typeof body === "undefined") return body;
const parsedContentType = contentType?.split("; ")[0];
switch (parsedContentType) {
case "image/svg+xml":
case "application/xml":
case "application/atom+xml":
case "text/xml": {
const parser = new import_fast_xml_parser.XMLParser({
ignoreDeclaration: true,
parseTagValue: false
});
const value = parser.parse(body);
return value;
}
case "application/json":
return JSON.parse(body);
default:
return body;
}
};
var getLoggerLevel = (statusCode) => {
const level = statusCode >= 500 ? "error" : statusCode >= 400 ? "warn" : "info";
return level;
};
var getRequestIp = (req) => req.headers["x-envoy-external-address"] ?? req.ip ?? "0.0.0.0";
var requestLogger = (config) => (req, res, next) => {
const logger = config?.logger ?? {
info: console.log,
warn: console.warn,
error: console.error
};
const requestId = (0, import_node_crypto.randomUUID)();
req.requestId = requestId;
let rawResponseBody;
let responseBody;
const send = res.send;
res.send = (body) => {
const contentType = res.getHeader("Content-Type");
rawResponseBody = body;
responseBody = parseBody(
body,
typeof contentType === "string" ? contentType : void 0
);
res.send = send;
return res.send(body);
};
res.on("finish", () => {
const level = getLoggerLevel(res.statusCode);
const ip = getRequestIp(req);
logger[level](
{ requestId },
`[${ip}] [${req.method}] ${req.originalUrl} ${req.protocol.toUpperCase()} ${req.httpVersion} ${res.statusCode}`
);
const requestContentType = req.header("Content-Type");
const requestBody = parseBody(req.body, requestContentType);
logger[level](
{ requestId, type: "REQUEST" },
JSON.stringify({
params: req.params,
query: req.query,
headers: req.headers,
cookies: req.cookies,
rawBody: req.body,
body: requestBody
})
);
logger[level](
{ requestId, type: "RESPONSE" },
JSON.stringify({
rawBody: rawResponseBody,
body: responseBody
})
);
});
next();
};
var index_default = requestLogger;
//# sourceMappingURL=index.cjs.map