我在javascript页面上有一个脚本来轮询快速路径/api/foo.这通常会回归304 (unchanged).如何仅针对响应禁用console.log日志记录?304
更新:我成功更改了Connect中的记录器以解决此问题(请参阅下面的历史记录).这些更改包含在Morgan中,当它从Connect中删除时,它是logger的替代品.请参阅Morgan文档中的skipfunction属性,它可以很好地解决这个问题.
我有好消息和坏消息.好消息是它可以做到.坏消息是,如果不修改记录器就无法完成.
在调用路由处理程序后,Express/Connect记录器实际上会执行日志记录(除非您immediate在创建记录器时指定该选项).它通过将自身附加到某些Node事件('finish'和'close',其中一个将始终在响应发送到客户端之前调用)来实现:
res.on('finish', logRequest);
res.on('close', logRequest);
Run Code Online (Sandbox Code Playgroud)
(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);
});
Run Code Online (Sandbox Code Playgroud)
这不是一个很好的解决方案.内置记录器为您做了很多工作,包括所有时髦的内置格式.但对于快速而肮脏的解决方案,这可能就足够了.
另一种解决方案是修改记录器本身.我基本上下载了当前的logger源代码(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');
};
Run Code Online (Sandbox Code Playgroud)
你会看到我检查一个叫做的函数options.skip; 如果该函数对给定的请求和响应返回true,则跳过日志记录.将此文件另存为conditionalLogger.js,安装单独的依赖项(npm install bytes --save),然后您就可以摇滚了:
var logger = require('./conditionalLogger.js')({
format: 'dev',
skip: function(req,res) {
return res.statusCode===304;
}
});
Run Code Online (Sandbox Code Playgroud)
这是一个更加灵活的解决方案,因为我们现在几乎可以在任何条件下跳过登录.
然而,缺点(它是一个很大的缺点)现在我们基本上分叉了一些Connect代码,那就是.......
我认为这是一个很好的功能,所以我会继续提交拉动请求...我们会看看Sencha Labs是否喜欢它......如果是这样,我会更新这个答案.
| 归档时间: |
|
| 查看次数: |
2080 次 |
| 最近记录: |