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

标签 node.js express

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

最佳答案

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

我有一个好消息和一个坏消息。好消息是它可以做到。坏消息是,如果不修改记录器就无法完成此操作。

Express/Connect 记录器实际上在调用路由处理程序之后进行记录(除非您在创建记录器时指定了immediate 选项)。它通过将自身附加到一些 Node 事件(“完成”和“关闭”,其中之一始终在响应发送到客户端之前被调用)来实现这一点:

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

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

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

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

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;
    }
});

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

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

我认为这是一个很好的功能,所以我将继续为此提交拉取请求...我们将看看 Sencha Labs 是否喜欢它...如果喜欢,我将更新此答案。

关于node.js - Express.js/Node 禁用某些请求日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21030885/

相关文章:

javascript - 将命令行变量传递给 npm 脚本?

javascript - 将createdAt保存为 Mongoose 中的时间戳

css - 你如何将css链接到jade文件?

node.js - 将nodejs部署到OpenShift,目录结构如下

Node.js - 检查用户是否存在

node.js - 403/禁止使用 NodeJS/Express 在 favicon 上显示

node.js - 在 Node Express 中包含自定义模块

sql - TypeORM 中具有关系目标基类的单表继承

node.js - 使用passport.js本地策略(使用用户名/密码)而不使用express.js

node.js - 如何使用 NodeJS 提高 AWS Lambda 函数的性能?