UNPKG

connect-leg

Version:

leg logging for connect applications

112 lines (91 loc) 2.81 kB
var deepmerge = require("deepmerge"), parstack = require("parstack"), randomId = require("proquint-random-id"); var connectLeg = module.exports = function connectLeg(log, toMerge) { if (typeof toMerge !== "object" && typeof toMerge !== "function") { toMerge = {}; } if (typeof toMerge === "object") { var _toMerge = toMerge; toMerge = function toMerge(req, res) { return _toMerge; }; } return function connectLeg(req, res, next) { req._leg_requestId = randomId(); req._leg_requestTime = Date.now(); log.info("request", deepmerge(toMerge(req, res), { http: { request: { id: req._leg_requestId, method: req.method, host: req.hostname || (req.headers['host'].indexOf(':') > -1) ? req.headers['host'].substring(0, req.headers['host'].indexOf(':')) : req.headers['host'], path: req.url, origin: req.headers.origin, referer: req.headers.referer }, }, })); var onEnd = function onEnd() { var level; if (res.statusCode >= 400 && res.statusCode <= 499) { level = "warn"; } else if (res.statusCode >= 500) { level = "error"; } else { level = "info"; } log[level]("response", deepmerge(toMerge(req, res), { http: { request: { id: req._leg_requestId, method: req.method, host: req.hostname || (req.headers['host'].indexOf(':') > -1) ? req.headers['host'].substring(0, req.headers['host'].indexOf(':')) : req.headers['host'], path: req.url }, response: { status: res.statusCode, }, }, timing: { duration: Date.now() - req._leg_requestTime, }, })); res.removeListener("finish", onEnd); res.removeListener("close", onEnd); }; res.on("finish", onEnd); res.on("close", onEnd); return next(); }; }; connectLeg.logger = connectLeg; connectLeg.errorHandler = function errorHandler(log, toMerge) { if (typeof toMerge !== "object" && typeof toMerge !== "function") { toMerge = {}; } if (typeof toMerge === "object") { var _toMerge = toMerge; toMerge = function toMerge(req, res) { return _toMerge; }; } return function errorHandler(err, req, res, next) { var status = parseInt(err.status || err.code || err.statusCode, 10); if (typeof status !== "number" || Number.isNaN(status)) { status = 500; } res.status(status); log.error("error", deepmerge(toMerge(req, res), { http: { request: { id: req._leg_requestId, }, }, error: parstack(err), })); if (!res.headersSent) { return res.send(err.toString()); } }; };