var commonFormatter = function(req, res){ if((typeof req.path) == 'function'){ //in restify path is a function var path = req.path(); } else{ //in express it is an attribute var path = req.originalUrl || req.path || req.url; } var httpHeader = req.header && req.header('x-forwarded-for') var requestID = req.header && req.header('x-request-id') var ip = req.ip || httpHeader || req.connection.remoteAddress; var requestData = { ip: ip, time: (new Date()).toISOString(), method: req.method, path: path, "status": res.statusCode, } if (requestID) { requestData.request_id = requestID; } if(res.get){ requestData.content_length = res.get('content-length'); requestData.content_type = res.get('content-type'); } return requestData; } var immediateLogger = function(logger, options, formatter){ return function(req, res, next){ var data = formatter(req, res); logger.log(data); next(); } } var timingLogger = function(logger, options, formatter){ return function(req, res, next){ var elapsed = options.elapsed || 'elapsed'; var timer = logger.time(elapsed); var end = res.end; res.end = function(chunk, encoding) { var data = formatter(req, res); res.end = end; res.end(chunk, encoding); timer.log(data); }; next(); } } exports.init = function(logger, options, formatter) { this.logger = logger; if(!formatter && !options){ formatter = commonFormatter; options = {}; } else if(!formatter){ if(typeof options == 'function'){ formatter = options; options = {}; }else{ formatter = commonFormatter; } } options = options || {}; if(options.immediate){ return immediateLogger(logger, options, formatter); }else{ return timingLogger(logger, options, formatter); } } exports.commonFormatter = commonFormatter;