github.com/cloudcredo/cloudrocker@v0.0.0-20160108110610-1320f8cc2dfd/sample-apps/node/node_modules/logfmt/lib/request_logger.js (about)

     1  var commonFormatter = function(req, res){
     2    if((typeof req.path) == 'function'){
     3      //in restify path is a function
     4      var path = req.path();
     5    }
     6    else{
     7      //in express it is an attribute
     8      var path = req.originalUrl || req.path || req.url;
     9    }
    10  
    11    var httpHeader = req.header && req.header('x-forwarded-for')
    12    var requestID  = req.header && req.header('x-request-id')
    13  
    14    var ip = req.ip || httpHeader
    15                    || req.connection.remoteAddress;
    16  
    17    var requestData =  {
    18      ip: ip,
    19      time: (new Date()).toISOString(),
    20      method: req.method,
    21      path: path,
    22      "status": res.statusCode,
    23    }
    24  
    25    if (requestID) {
    26      requestData.request_id = requestID;
    27    }
    28  
    29    if(res.get){
    30      requestData.content_length = res.get('content-length');
    31      requestData.content_type = res.get('content-type');
    32    }
    33    return requestData;
    34  }
    35  
    36  var immediateLogger = function(logger, options, formatter){
    37    return function(req, res, next){
    38      var data = formatter(req, res);
    39      logger.log(data);
    40      next();
    41    }
    42  }
    43  
    44  var timingLogger = function(logger, options, formatter){
    45    return function(req, res, next){
    46      var elapsed = options.elapsed || 'elapsed';
    47      var timer   = logger.time(elapsed);
    48      var end = res.end;
    49      res.end = function(chunk, encoding) {
    50        var data = formatter(req, res);
    51        res.end = end;
    52        res.end(chunk, encoding);
    53        timer.log(data);
    54      };
    55      next();
    56    }
    57  }
    58  
    59  exports.init = function(logger, options, formatter) {
    60    this.logger = logger;
    61  
    62    if(!formatter && !options){
    63      formatter = commonFormatter;
    64      options = {};
    65    }
    66    else if(!formatter){
    67      if(typeof options == 'function'){
    68        formatter = options;
    69        options = {};
    70      }else{
    71        formatter = commonFormatter;
    72      }
    73    }
    74    options = options || {};
    75  
    76    if(options.immediate){
    77      return immediateLogger(logger, options, formatter);
    78    }else{
    79      return timingLogger(logger, options, formatter);
    80    }
    81  }
    82  
    83  exports.commonFormatter = commonFormatter;