swaf/src/components/LogRequestsComponent.ts

89 lines
3.0 KiB
TypeScript

import {Request, Response, Router} from "express";
import onFinished from "on-finished";
import ApplicationComponent from "../ApplicationComponent.js";
import {HttpError} from "../HttpError.js";
import {logger} from "../Logger.js";
export default class LogRequestsComponent extends ApplicationComponent {
private static fullRequests: boolean = false;
public static logFullHttpRequests(): void {
this.fullRequests = true;
logger.info('Http requests will be logged with more details.');
}
public static logRequest(
req: Request,
res: Response,
err?: unknown,
additionalStr: string = '',
silent: boolean = false,
): string | undefined {
if (LogRequestsComponent.fullRequests) {
const requestObj = JSON.stringify({
ip: req.ip,
host: req.hostname,
method: req.method,
url: req.originalUrl,
headers: req.headers,
query: req.query,
params: req.params,
body: req.body,
files: req.files,
cookies: req.cookies,
sessionId: req.sessionID,
result: {
code: res.statusCode,
},
}, null, 4);
if (err) {
if (err instanceof Error) {
return logger.error(err, requestObj, err).requestId;
} else {
return logger.error(new Error(String(err)), requestObj).requestId;
}
} else {
logger.info(requestObj);
}
} else {
let codeDescription = '';
if (res.statusCode === 301) {
codeDescription = 'Permanent redirect to ' + res.getHeader('location');
} else if (res.statusCode === 302) {
codeDescription = 'Temporary redirect to ' + res.getHeader('location');
}
let logStr = `${req.ip} < ${req.method} ${req.originalUrl} - ${res.statusCode} ${codeDescription}`;
if (err) {
if (err instanceof Error) {
if (silent) {
if (err instanceof HttpError) logStr += ` ${err.errorCode}`;
logStr += ` ${err.name}`;
return logger.info(err.name, logStr).requestId;
} else {
return logger.error(err, logStr, additionalStr, err).requestId;
}
} else {
return logger.error(new Error(String(err)), logStr).requestId;
}
} else {
logger.info(logStr);
}
}
return '';
}
public async initRoutes(router: Router): Promise<void> {
router.use((req, res, next) => {
onFinished(res, (err) => {
if (!err) {
LogRequestsComponent.logRequest(req, res);
}
});
next();
});
}
}