我在javascript页面上有一个脚本,用于轮询快速路径/api/foo
。这通常会返回304 (unchanged)
。如何禁用仅console.log
响应的304
日志记录?
答案 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>