@fofmbarros/express-logger
Version:
Plug and play Express.js request and response middleware
85 lines • 2.44 kB
JavaScript
// src/index.ts
import { XMLParser } from "fast-xml-parser";
import { randomUUID } from "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 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 = 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;
export {
index_default as default
};
//# sourceMappingURL=index.js.map