如何使用Winston / Morgan记录JSON HTTP响应

时间:2015-07-08 14:49:33

标签: json node.js express sails.js winston

我正在使用Winston和Morgan进行Sails.js中的所有后端日志记录,我需要能够记录来自HTTP get请求的响应。我需要将它们记录在一个文件中。我的logFile当前显示所有的http请求但它没有显示响应。我搜索了摩根和温斯顿的所有选项,但找不到这样做的方法/选项。我只是想知道你们是否有任何关于如何实现这一目标的建议? 谢谢!

1 个答案:

答案 0 :(得分:4)

您可以为ExpressJS编写一个中间件函数,该函数将在发送响应后记录正文。将它基于Node的http module,看看Connect(以及Express)如何管理响应体(它是一个流):你可以挂钩写入该流的两个方法来获取块,然后连接/解码它们以记录它。简单的解决方案,可以使其更加健壮,但它表明这个概念有效。

function bodyLog(req, res, next) {
  var write = res.write;
  var end = res.end;
  var chunks = [];

  res.write = function newWrite(chunk) {
    chunks.push(chunk);

    write.apply(res, arguments);
  };

  res.end = function newEnd(chunk) {
    if (chunk) { chunks.push(chunk); }

    end.apply(res, arguments);
  };

  res.once('finish', function logIt() {
    var body = Buffer.concat(chunks).toString('utf8');

    // LOG BODY
  });

  next();
}

然后在主app路由器中分配任何路由之前设置它:

app.use(bodyLog);
// assign routes

我认为你也可以使用它作为摩根变量的赋值,但我还没有研究异步变量赋值是如何工作的。