diff --git a/apps/input-descriptor-to-credential/src/middlewares/access-log.middleware.ts b/apps/input-descriptor-to-credential/src/middlewares/access-log.middleware.ts index 5fd4bffe..f45d894d 100644 --- a/apps/input-descriptor-to-credential/src/middlewares/access-log.middleware.ts +++ b/apps/input-descriptor-to-credential/src/middlewares/access-log.middleware.ts @@ -29,9 +29,48 @@ export class AccessLog implements NestMiddleware { let finished = false; + let responseBody: string; + + 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 delay = Date.now() - now; - const message = `${res.statusCode} | [${method}] ${url} - ${delay}ms`; + const message = `${res.statusCode} ${res.statusMessage} | ${req.ip} | [${method}] ${url} - ${delay}ms`; finished = true; @@ -42,6 +81,14 @@ export class AccessLog implements NestMiddleware { } else { this.logger.log(message); } + + if (req.body) { + this.logger.debug(`request body: ${JSON.stringify(req.body)}`); + } + + if (responseBody) { + this.logger.debug(`response body: ${responseBody}`); + } }); res.on('close', () => {