RequestLogger.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. const logger = require('logger-sharelatex')
  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' : 'log'
  36. logger[level](
  37. {
  38. req: {
  39. url: req.originalUrl || req.url,
  40. route: routePath,
  41. method: req.method,
  42. referrer: req.headers.referer || req.headers.referrer,
  43. 'remote-addr':
  44. req.ip ||
  45. (req.socket && req.socket.remoteAddress) ||
  46. (req.socket &&
  47. req.socket.socket &&
  48. req.socket.socket.remoteAddress),
  49. 'user-agent': req.headers['user-agent'],
  50. 'content-length': req.headers['content-length'],
  51. },
  52. res: {
  53. 'content-length': res._headers['content-length'],
  54. statusCode: res.statusCode,
  55. 'response-time': responseTime,
  56. },
  57. info: req.requestLogger._logInfo,
  58. },
  59. req.requestLogger._logMessage
  60. )
  61. }
  62. next()
  63. }
  64. }
  65. module.exports = RequestLogger