Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@doodle/logger / src / middleware.js
Size: Mime:
/**
 * Middleware for express. Logs requests and errors.
 */

const TracingHeader = {
  trace: 'X-B3-TraceId',
  span: 'X-B3-SpanId',
  parent: 'X-B3-ParentSpanId',
  exportable: 'X-Span-Export',
};

/**
 * @param {Request} req The express request object
 */
function extractHeaderProperties(req) {
  const headerProps = {
    trace: req.get(TracingHeader.trace),
    span: req.get(TracingHeader.span),
    parent: req.get(TracingHeader.parent),
    exportable: req.get(TracingHeader.exportable),
  };

  return {
    ...headerProps,
  };
}

const LoggerMiddleware = {
  /**
   *
   * @param {*} req
   * @param {*} res
   * @param {*} next
   */
  expressLogger(req, res, next) {
    const { logger } = req.app.locals;
    if (res.finished) {
      logger.debug(`Request handled`, {
        ...extractHeaderProperties(req),
        reqUrl: req.originalUrl,
        resStatusCode: `${res.statusCode}`,
      });
    } else {
      // Express sends a 404 if the response was not yet sent at the end of the middleware chain
      // See https://expressjs.com/en/starter/faq.html#how-do-i-handle-404-responses
      logger.debug(`Requested unhandled resource`, {
        ...extractHeaderProperties(req),
        reqUrl: req.originalUrl,
        resStatusCode: `404`,
      });
    }
    next();
  },

  /**
   *
   * @param {*} err
   * @param {*} req
   * @param {*} res
   * @param {*} next
   */
  expressErrorLogger(err, req, res, next) {
    const { logger } = req.app.locals;
    if (!res.finished) {
      res.status(500).json({
        errorMessage: 'The server could not process the request.',
      });
    }
    logger.error(`Error handling request:\n${err.stack}`, {
      ...extractHeaderProperties(req),
      reqUrl: req.originalUrl,
      resStatusCode: `${res.statusCode}`,
    });

    next(err);
  },

  initialize(app, logger) {
    app.locals.logger = logger;
  },
};

module.exports = LoggerMiddleware;