57 lines
1.6 KiB
TypeScript
57 lines
1.6 KiB
TypeScript
import CreateLogCtx from "lib/logger/logger";
|
|
import type { RequestHandler, Response } from "express";
|
|
|
|
const logger = CreateLogCtx(__filename);
|
|
|
|
// https://stackoverflow.com/a/64546368/11885828
|
|
const ResSendInterceptor = (res: Response, send: Response["send"]) => (content: unknown) => {
|
|
// @ts-expect-error general monkeypatching error
|
|
res.contentBody = content;
|
|
res.send = send;
|
|
res.send(content);
|
|
};
|
|
|
|
export const RequestLoggerMiddleware: RequestHandler = (req, res, next) => {
|
|
logger.debug(`Received request ${req.method} ${req.originalUrl}.`, {
|
|
query: req.query,
|
|
body: req.body,
|
|
});
|
|
|
|
// @ts-expect-error we're doing some wacky monkey patching
|
|
res.send = ResSendInterceptor(res, res.send);
|
|
|
|
res.on("finish", () => {
|
|
const contents = {
|
|
// @ts-expect-error we're doing some monkey patching - contentBody is what we're returning.
|
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
body: res.contentBody,
|
|
statusCode: res.statusCode,
|
|
requestQuery: req.query,
|
|
requestBody: req.body,
|
|
fromIp: req.ip,
|
|
};
|
|
|
|
// special overrides
|
|
// This stuff is spam, so we'll just not log it.
|
|
if (res.statusCode === 429) {
|
|
return;
|
|
}
|
|
|
|
if (res.statusCode < 400 || res.statusCode === 404) {
|
|
logger.verbose(
|
|
`(${req.method} ${req.originalUrl}) Returned ${res.statusCode}.`,
|
|
contents
|
|
);
|
|
} else if (res.statusCode < 500) {
|
|
logger.info(`(${req.method} ${req.originalUrl}) Returned ${res.statusCode}.`, contents);
|
|
} else {
|
|
logger.error(
|
|
`(${req.method} ${req.originalUrl}) Returned ${res.statusCode}.`,
|
|
contents
|
|
);
|
|
}
|
|
});
|
|
|
|
next();
|
|
};
|