We needed a provision to capture API requests and responses. This was so that our mobile team could get a summary of what the app was sending and receiving. Once captured we wrote them in a file in the last-in-first-seen order.
We eventually started off by implementing the Nest Middleware but then we realized a middleware can only receive requests. So we switched to Interceptors.
An interceptor has access to both requests and responses.
Here is the code.
class LoggerInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable<any> { let logFile = process.env.LOGGER_APP + ".log"; let logPath = process.cwd() + "<path>" + logFile; let { url, method, headers, body } = context.switchToHttp().getRequest(); if (url != "/logs/dev.log") { let logMessage = "\n\n=======================================\n\nTIME: " + Date().toString() + "\nMETHOD: " + JSON.stringify(method) + "\nURL: " + JSON.stringify(url) + "\nHEADERS: " + JSON.stringify(headers) + "\nBODY: " + JSON.stringify(body) + "\nRESPONSE: "; return next.handle().pipe(tap((data) => { let responseBody = JSON.stringify(data); logMessage += responseBody; // Reading old data. logMessage += fs.readFileSync(logPath); fs.writeFile(logPath, logMessage, function (err, file) { }); })); } } } A couple of points worth mentioning -
- is the path to where your log files should be stored. We wanted the app team to have access to the logs so we kept them in a public folder.
- We put up a check (!= "/logs/dev.log") to prevent logging access to the log file into the log file :D Lol!
Happy Programming!!!
Top comments (1)
Thanks a lot, this work for me!