kozukata-toa/src/servers/allnet/middleware/request-logger.ts

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();
};