添加钩子以全局记录node.js / express中的所有节点HTTP响应

时间:2012-01-03 22:37:07

标签: node.js express

我正在使用node.js和express来处理HTTP请求和响应。通过使用http.ServerRequest事件,我可以添加一个钩子并记录HTTP请求。 http.ServerResponse似乎没有类似的事件,我想知道如何使用我的服务器发送的一段代码记录所有HTTP响应?

4 个答案:

答案 0 :(得分:10)

我创建了一个包含这样的东西的包,出于类似的需要。查看express-request-logger

程序的核心是这样的,它包含一些额外的代码,因此您可以拥有自己的每个请求记录的数据键值映射:

// Save the real end that we will wrap
var rEnd = res.end;

// To track response time
req._rlStartTime = new Date();

// Proxy the real end function
res.end = function(chunk, encoding) {
  // Do the work expected
  res.end = rEnd;
  res.end(chunk, encoding);

  // And do the work we want now (logging!)

  // Save a few more variables that we can only get at the end
  req.kvLog.status = res.statusCode;
  req.kvLog.response_time = (new Date() - req._rlStartTime);

  // Send the log off to winston
  var level = req.kvLog._rlLevel;
  delete req.kvLog._rlLevel;
  logger.log(level, '', req.kvLog);
};

以上代码在express中作为中间件运行。看看代码,如果您还有其他问题,请在这里或github与我联系。

答案 1 :(得分:9)

monkeypatch不再需要,只要在end() function上发出结束事件,因为node.js为0.8.12。

实际上,它最初在0.8.8中发布为结束(另请查看this)但it broke writable streams' duplexes,因此已重命名为完成。

答案 2 :(得分:3)

如果您只想记录(请求和/或回复),请查看express-winstonUnlike morgan,它甚至可以记录请求/响应正文。

coffeescript中的示例:

expressWinston.requestWhitelist.push('body')
expressWinston.responseWhitelist.push('body')
app.use(expressWinston.logger({
      transports: [
        new winston.transports.Console({
          json: true,
          colorize: true
        })
      ],
      meta: true, // optional: control whether you want to log the meta data about the request (default to true)
      msg: "HTTP {{req.method}} {{req.url}}", // optional: customize the default logging message. E.g. "{{res.statusCode}} {{req.method}} {{res.responseTime}}ms {{req.url}}"
      expressFormat: true, // Use the default Express/morgan request formatting, with the same colors. Enabling this will override any msg and colorStatus if true. Will only output colors on transports with colorize set to true
      colorStatus: true, // Color the status code, using the Express/morgan color palette (default green, 3XX cyan, 4XX yellow, 5XX red). Will not be recognized if expressFormat is true
      ignoreRoute: function (req, res) { return false; } // optional: allows to skip some log messages based on request and/or response
    }));

答案 3 :(得分:-6)

如果您对所有响应使用快速'res.send(),并且您不介意将代码插入快速模块,则可以插入 进入

... / node_modules /表达/ LIB / response.js:

43 res.send = function(body, headers, status){
44   console.log("\n...your log text here..." + body);
45   // allow status as second arg
46   if ('number' == typeof headers) {
47     status = headers,
48     headers = null;
49   }

我认为你不能听一个非错误的事件 - res.send();似乎没有触发“关闭”。我猜是因为send()总是在代码中的某个地方调用。