我在 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/