RequestLogger.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. const logger = require('@overleaf/logger')
  2. const metrics = require('@overleaf/metrics')
  3. class RequestLogger {
  4. constructor() {
  5. this._logInfo = {}
  6. this._logMessage = 'http request'
  7. }
  8. addFields(fields) {
  9. Object.assign(this._logInfo, fields)
  10. }
  11. setMessage(message) {
  12. this._logMessage = message
  13. }
  14. static errorHandler(err, req, res, next) {
  15. req.requestLogger.addFields({ error: err })
  16. res.status(500).send(err.message)
  17. }
  18. static middleware(req, res, next) {
  19. const startTime = new Date()
  20. req.requestLogger = new RequestLogger()
  21. // override the 'end' method to log and record metrics
  22. const end = res.end
  23. res.end = function () {
  24. // apply the standard request 'end' method before logging and metrics
  25. end.apply(this, arguments)
  26. const responseTime = new Date() - startTime
  27. const routePath = req.route && req.route.path.toString()
  28. if (routePath) {
  29. metrics.timing('http_request', responseTime, null, {
  30. method: req.method,
  31. status_code: res.statusCode,
  32. path: routePath.replace(/\//g, '_').replace(/:/g, '').slice(1),
  33. })
  34. }
  35. const level = res.statusCode >= 500 ? 'err' : 'debug'
  36. logger[level](
  37. {
  38. req,
  39. res,
  40. responseTimeMs: responseTime,
  41. info: req.requestLogger._logInfo,
  42. },
  43. req.requestLogger._logMessage
  44. )
  45. }
  46. next()
  47. }
  48. }
  49. module.exports = RequestLogger