From a7e482b9e6fcddcc77729593f53ccb787ede20a0 Mon Sep 17 00:00:00 2001 From: Artur Sudnik-Hrynkiewicz Date: Tue, 17 Oct 2023 14:27:42 +0200 Subject: [PATCH 1/2] feat: adding response body to the access log --- .../src/middlewares/http-logger.middleware.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/apps/vc-api/src/middlewares/http-logger.middleware.ts b/apps/vc-api/src/middlewares/http-logger.middleware.ts index 055a827..67cf022 100644 --- a/apps/vc-api/src/middlewares/http-logger.middleware.ts +++ b/apps/vc-api/src/middlewares/http-logger.middleware.ts @@ -12,6 +12,27 @@ export class HttpLoggerMiddleware implements NestMiddleware { let finished = false; + const oldWrite = res.write; + const oldEnd = res.end; + const chunks: Buffer[] = []; + let responseBody: string; + + res.write = (...args: unknown[]): boolean => { + chunks.push(args[0] as Buffer); + return oldWrite.apply(res, args); + }; + + res.end = (...args: unknown[]) => { + const chunk = args[0] as Buffer; + + if (chunk) { + chunks.push(chunk); + } + + responseBody = Buffer.concat(chunks).toString(); + return oldEnd.apply(res, args); + }; + res.on('finish', () => { const message = `${res.statusCode} ${res.statusMessage} | ${req.ip} | [${method}] ${url} - ${ Date.now() - requestStarted @@ -30,6 +51,10 @@ export class HttpLoggerMiddleware implements NestMiddleware { if (req.body) { this.logger.debug(`request body: ${JSON.stringify(req.body)}`); } + + if (responseBody) { + this.logger.debug(`response body: ${responseBody}`); + } }); res.on('close', () => { From 1bec34c4a90f34b1302996e16de6ab7fc27d0685 Mon Sep 17 00:00:00 2001 From: Artur Sudnik-Hrynkiewicz Date: Tue, 17 Oct 2023 15:26:05 +0200 Subject: [PATCH 2/2] chore: adding error handling --- .../src/middlewares/http-logger.middleware.ts | 54 ++++++++++++------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/apps/vc-api/src/middlewares/http-logger.middleware.ts b/apps/vc-api/src/middlewares/http-logger.middleware.ts index 67cf022..1752583 100644 --- a/apps/vc-api/src/middlewares/http-logger.middleware.ts +++ b/apps/vc-api/src/middlewares/http-logger.middleware.ts @@ -12,26 +12,44 @@ export class HttpLoggerMiddleware implements NestMiddleware { let finished = false; - const oldWrite = res.write; - const oldEnd = res.end; - const chunks: Buffer[] = []; let responseBody: string; - res.write = (...args: unknown[]): boolean => { - chunks.push(args[0] as Buffer); - return oldWrite.apply(res, args); - }; - - res.end = (...args: unknown[]) => { - const chunk = args[0] as Buffer; - - if (chunk) { - chunks.push(chunk); - } - - responseBody = Buffer.concat(chunks).toString(); - return oldEnd.apply(res, args); - }; + try { + const oldWrite = res.write; + const oldEnd = res.end; + const chunks: Buffer[] = []; + + res.write = (...args: unknown[]): boolean => { + try { + chunks.push(args[0] as Buffer); + } catch (err) { + this.logger.error(`error collecting response body chunk: ${err}`); + this.logger.verbose(err.stack); + } + + return oldWrite.apply(res, args); + }; + + res.end = (...args: unknown[]) => { + try { + const chunk = args[0] as Buffer; + + if (chunk) { + chunks.push(chunk); + } + + responseBody = Buffer.concat(chunks).toString(); + } catch (err) { + this.logger.error(`error collecting response body chunk: ${err}`); + this.logger.verbose(err.stack); + } + + return oldEnd.apply(res, args); + }; + } catch (err) { + this.logger.error(`error setting response body to be collected: ${err}`); + this.logger.verbose(err.stack); + } res.on('finish', () => { const message = `${res.statusCode} ${res.statusMessage} | ${req.ip} | [${method}] ${url} - ${