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



我在Sails.js中使用Winston和Morgan进行所有后端日志记录,并且我需要能够记录来自HTTP get请求的响应。我需要把它们记录在文件里。我的logFile目前显示所有的http请求,但它不显示响应。我已经为摩根和温斯顿搜索了所有的选项,但找不到这样做的方法/选项。我只是想知道你们中有人对如何做到这一点有什么建议吗?谢谢!

您可以为ExpressJS编写一个中间件函数,一旦发送响应,它将记录body。以Node的http模块为基础,看看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.use(bodyLog);
// assign routes

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

最新更新