Javascript 过滤node.js中的传出请求以进行日志记录

Javascript 过滤node.js中的传出请求以进行日志记录,javascript,node.js,Javascript,Node.js,我正在构建一个Express应用程序,它在某些请求下必须进行自己的HTTP调用。我可以使用超级代理、请求或节点自己的http.request。 问题是,我需要记录所有这些服务器发起的请求及其相应的响应。在每一个之前调用log.info似乎都很愚蠢 如何为所有传出的HTTP呼叫添加预过滤器,并理想地访问req和res 注意:我对记录进入我正在构建的服务器的请求不感兴趣,只对服务器本身启动的请求感兴趣。将我的服务器视为另一个黑匣子服务器的客户端。您可以做的是修补http和https并代理请求方法。这

我正在构建一个Express应用程序,它在某些请求下必须进行自己的HTTP调用。我可以使用超级代理、请求或节点自己的
http.request
。 问题是,我需要记录所有这些服务器发起的请求及其相应的响应。在每一个之前调用
log.info
似乎都很愚蠢

如何为所有传出的HTTP呼叫添加预过滤器,并理想地访问
req
res


注意:我对记录进入我正在构建的服务器的请求不感兴趣,只对服务器本身启动的请求感兴趣。将我的服务器视为另一个黑匣子服务器的客户端。

您可以做的是修补http和https并代理
请求
方法。这样,您就可以有一个全局处理程序来捕获req&res对象

var http    = require('http');
var https   = require('https');

var patch = function(object) {
    var original = object.request;

    // We proxy the request method
    object.request = function(options, callback) {
        // And we also proxy the callback to get res
        var newCallback = function() {
            var res = arguments[0];

            // You can log res here
            console.log("RES",res.statusCode);

            callback.apply(this,arguments);
        }

        var req = original(options, newCallback);

        // You can log your req object here.
        console.log(req.method,req.path);

        return req;
    }
}

patch(http);
patch(https);

http.get("http://www.google.com/index.html", function(res) {
  console.log("Got response");
}).on('error', function(e) {
  console.log("Got error: " + e.message);
});

编辑:如果您也使用
request
npm包,这可能会起作用,因为它可能只依赖于内置的node.js
http.request
方法。

应用程序将使用哪台服务器? 我肯定会把这种功能带到服务器级别。看看heroku路由器是如何做到这一点的。您可以使用papertrail或newrelic(或在应用程序中单独使用)等插件来跟踪所有需要的信息

在这种情况下,我喜欢现成的解决方案,不需要扩展应用程序逻辑来记录此类信息

如果您想拥有自己的解决方案,可以将nginx设置为监视请求/响应信息。

您可能需要首先确定用于传出请求的库,然后查看如何记录这些请求。你想记录什么,只是标题?还是完整的请求主体?我一直在尝试请求。有,但看到实现让我有点畏缩。在Superagent和普通节点API中,我没有找到任何明显的连接位置。我想记录请求方法和URL,以及响应状态和时间。我正在尝试一些方法,如果有效,我会将其作为答案发布。通过代理
http.request
添加了一种方法。否则,您也可以编写自己的请求方法,该方法将是http.request或任何其他请求库的包装器,用于处理日志记录。再次阅读问题,他希望记录其应用程序发出的传出请求,而不是传入请求。他想要一个能记录所有HTTP请求的包罗万象的服务,而不是记录接收到的HTTP请求。这两种服务都能轻松跟踪出站流量。但这不是他想要的。他正在寻求一种方法,在他的应用程序中,捕获所有HTTP请求并只记录一些请求,如果需要的话,添加他自己的过滤层。我不会在应用程序中引入日志记录,不管怎样,只是我的意见(如果日志记录是最终目标的话)。否则我同意你的解决方案。谢谢!这是一种方法。唯一的缺点是,你正在走下坡路,依靠节点的http记录所有事情,而不一定只是你的应用程序的调用。是的,有多种方法可以做到这一点,最好是写下你自己的类,这将是一个额外的抽象层,并记录在那里,这样,您就不必依赖于底层实现。我们的梦想是让库实现预过滤回调。我将去ping Superagent或request。同时,你的回答完全回答了这个问题。谢谢注:不幸的是,请求可能会影响res和req,当使用Bunyan及其标准序列化程序登录时,stdout的输出失控,机器内存不足。是的,如果他们还没有,只需在Github上打开一个问题。Request确实向req和res添加了一些内容,但是如果使用我给您的代码,您将在对象被
Request
修改之前访问它们,因此它应该仍然是相同的。另外,不要序列化整个对象,您应该只记录对象的有趣属性,如状态代码、路径、相关标题等。很高兴我的答案对您有用!我同意。不幸的是,Bunyan标准序列化程序中的这一行使它试图序列化整个请求对象:这是因为请求上没有连接对象