Express.js / Node禁用某些请求日志

时间:2014-01-09 20:54:00

标签: node.js express

我在javascript页面上有一个脚本,用于轮询快速路径/api/foo。这通常会返回304 (unchanged)。如何禁用console.log响应304日志记录?

1 个答案:

答案 0 :(得分:6)

更新:我成功更改了Connect中的记录器以解决此问题(请参阅下面的历史记录)。这些更改包含在Morgan中,当它从Connect中删除时,它是logger的替代品。请参阅Morgan documentation了解skip函数属性,该属性可以很好地解决此问题。

我有好消息和坏消息。好消息是可以完成。坏消息是,如果不修改记录器就无法完成。

在调用路由处理程序之后,Express / Connect记录器实际上会执行日志记录(除非您在创建记录器时指定immediate选项)。它通过将自身附加到某些Node事件('finish'和'close',其中一个将始终在响应发送到客户端之前调用)来实现这一点:

res.on('finish', logRequest);
res.on('close', logRequest);

logRequest是一个实际执行日志记录的内部函数。)

所以问题是,没有任何可扩展性:我们也可以监听这些事件,但是我们无法拦截或有条件地控制记录器注入的处理程序。没有有效的方法来包装记录器中间件来进行条件记录。

所以有两种方法可以解决这个问题。一个是编写我们自己的记录器。这实际上并不是一个可怕的命题(它基本上复制了记录器已经在做的事情):

app.use(function(req,res,next){

   function logRequest(){
      res.removeListener('finish', logRequest);
      res.removeListener('close', logRequest);
      if(res.statusCode!==304){
          console.log(/*whatever you want to actually log...*/);
      }
    };

    res.on('finish', logRequest);
    res.on('close', logRequest);
});

这不是一个很好的解决方案。内置记录器为您做了很多工作,包括所有时髦的内置格式。但是对于一个快速而肮脏的解决方案,这就足够了。

另一种解决方案是修改记录器本身。我基本上下载了当前的记录器源代码(https://github.com/senchalabs/connect/blob/master/lib/middleware/logger.js),然后修改了logRequest函数(在logger方法内):

function logRequest(){
  res.removeListener('finish', logRequest);
  res.removeListener('close', logRequest);
  if(options.skip && options.skip(req,res)) return;
  var line = fmt(exports, req, res);
  if (null == line) return;
  stream.write(line + '\n');
};

你会看到我检查一个名为options.skip的函数;如果该函数对给定的请求和响应返回true,则跳过日志记录。将此文件另存为conditionalLogger.js,安装单独的依赖项(npm install bytes --save),然后您就可以摇滚了:

var logger = require('./conditionalLogger.js')({
    format: 'dev',
    skip: function(req,res) {
        return res.statusCode===304;
    }
});

这是一个更加灵活的解决方案,因为我们现在几乎可以在任何条件下跳过登录。

然而,缺点(这是一个很大的缺点)现在我们基本上已经分叉了一些Connect代码,那就是......。

我认为这是一个很好的功能,所以我会继续提交拉动请求...我们会看看Sencha Labs是否喜欢它...如果是这样,我会更新这个答案。< / p>