Skip to content

Commit

Permalink
add middleware loggers
Browse files Browse the repository at this point in the history
  • Loading branch information
abhayrp2000 committed Jul 14, 2023
1 parent 7af4c55 commit 411f1ee
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 0 deletions.
9 changes: 9 additions & 0 deletions @types/express/index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { User } from "@prisma/client";

declare global {
namespace Express {
interface Request {
requestId: string;
}
}
}
71 changes: 71 additions & 0 deletions src/middleware/log/http-requests-logger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import { NextFunction, Response, Request } from "express";
import { randomUUID } from "crypto";
import { Logger } from "./logger";
const logger = new Logger();

let responseBody: string | undefined = undefined;

export const logRequest = (req: Request, res: Response, next: NextFunction) => {
try {
const requestId = randomUUID();
req.requestId = requestId;

logger.http(`[REQ] [${req.requestId}] [${req.method}] - ${req.url}`, {
...req.body,
});

const [oldWrite, oldEnd] = [res.write, res.end];
const chunks: Buffer[] = [];

(res.write as unknown) = function (chunk: any) {
chunks.push(Buffer.from(chunk));
(oldWrite as Function).apply(res, arguments);
};

//@ts-ignore
res.end = function (chunk) {
if (chunk) {
chunks.push(Buffer.from(chunk));
}
const body = Buffer.concat(chunks).toString("utf8");
responseBody = body;
(oldEnd as Function).apply(res, arguments);
};

const cleanup = () => {
res.removeListener("finish", logFn);
res.removeListener("close", abortFn);
res.removeListener("error", errorFn);
};

const logFn = () => {
cleanup();
logger.http(
`[RES] [${req.requestId}] [${req.method}] - ${req.url} - ${res.statusCode} - ${responseBody}`
);
};

const abortFn = () => {
cleanup();
logger.http(
`[RES] [${req.requestId}] [${req.method}] - ${req.url} - Request aborted by the user`
);
};

const errorFn = (err: any) => {
cleanup();
logger.http(
`[${req.requestId}] [${req.method}] - ${req.url} Error: ${err}`
);
};

res.on("finish", logFn);
res.on("close", abortFn);
res.on("error", errorFn);

next();
} catch (err) {
console.log(err);
next();
}
};
41 changes: 41 additions & 0 deletions src/middleware/log/logger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { getLoggerFormatedDate } from "../../utils";

class Logger {
info(message: any, data?: any) {
if (data) {
console.log(
`${getLoggerFormatedDate()} | INFO | ${message} | ${JSON.stringify(
data
)}`
);
} else {
console.log(`${getLoggerFormatedDate()} | INFO | ${message}`);
}
}

error(message: any, data?: any) {
if (data) {
console.log(
`${getLoggerFormatedDate()} | ERROR | ${message} | ${JSON.stringify(
data
)}`
);
} else {
console.log(`${getLoggerFormatedDate()} | ERROR | ${message}`);
}
}

http(message: any, data?: any) {
if (data) {
console.log(
`${getLoggerFormatedDate()} | HTTP | ${message} | ${JSON.stringify(
data
)}`
);
} else {
console.log(`${getLoggerFormatedDate()} | HTTP | ${message}`);
}
}
}

export { Logger };
19 changes: 19 additions & 0 deletions src/middleware/request-validator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { Request, Response, NextFunction } from "express";
import { validationResult } from "express-validator";

export const validateRequest = (
req: Request,
res: Response,
next: NextFunction
) => {
const errors = validationResult(req);
if (errors.isEmpty()) {
return next();
}
const extractedErrors: any[] = [];
errors.array().map((err:any) => extractedErrors.push({ [err.param]: err.msg }));

return res.status(422).json({
errors: extractedErrors,
});
};
5 changes: 5 additions & 0 deletions src/utils/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import moment from "moment-timezone";

export const getLoggerFormatedDate = () => {
return moment().toLocaleString();
};

0 comments on commit 411f1ee

Please sign in to comment.