javascript中console.log的实际拦截器
An actual interceptor for console.log in javascript
通常的建议(捕获javascript console.log?)对于js console.log拦截器有两个不足,都很严重:
(i)实际浏览器控制台中所有的调用现在看起来都来自同一行——定义新函数的地方——而不是执行调用的地方
(ii)截获的参数还没有像console.log
那样格式化(即%
的替代商品,特别是%o
):
(function() {
function send_stuff(){ /* Deal with console arguments. */ }
var oldLog=console.log;
console.log=function(msg) {
oldLog.apply(this,arguments);
send_stuff(Array.prototype.slice.call(arguments).join());
}
}())
console.log("test");
console.log("Hello %s", "Bob");
console.log("Here is an object %o", { stuff: "thing" });
也许已经设计出更好的东西(例如能够捕获console.log的实际缓冲区内容的东西)。
编辑:为了澄清多参数失败:除了扩展文件/行信息外,console.log还对%序列进行了一些巧妙的替换- a-la-printf。特别令人感兴趣的是%o序列,其中扩展了后续对象的深层转储,并由浏览器的控制台窗口充分利用。这是无法复制的,除非你愿意基本上重新实现它的逻辑(不必要的,而且很可能是低效的)
欢呼,
看起来console.log
的行为改变了一点,现在遮罩正在工作,但您仍然在控制台中获得oldLog.apply(this,arguments);
的行。您可以做的一件事是使用console.error
代替,这将显示调用堆栈,您可以使用它来查看最初调用修改后的日志方法的行。
另一个解决方案是抛出一个错误以从调用堆栈中获取行号,如下所示
(function () {
function origin() {
try {
throw Error('');
} catch (err) {
return err.stack.split(''n').slice(-1)[0];
}
}
function send_stuff() { /* Deal with console arguments. */ }
var oldLog = console.log;
console.log = function (msg) {
oldLog.call(this, ...arguments, origin());
send_stuff(Array.prototype.slice.call(arguments).join());
};
})();
console.log("test");
console.log("Hello %s", "Bob");
console.log("Here is an object %o", {
stuff: "thing"
});
相关文章:
- Array.length似乎不起作用;console.log则显示其他情况
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- console.log以外的Javascript输出函数
- 如果在代码末尾进行求值,jQuery-console.log将提供空数组
- 为什么生成器中的console.log会按这样的顺序出现
- async问题,JS Promise无法返回结果,但可以使用console.log
- 谷歌地图:函数返回未定义的值在console.log中运行良好
- 我应该返回一个类似console.log()的方法调用吗
- console.log无法运行Mac OS X
- 如何使console.log可配置
- 如何使用console.log语句在Mocha中测试函数
- 为什么我可以't直接将console.log()设置为回调函数
- Node.js/Express未输出console.log,highcharts.js给出未定义的错误
- console.log在角度控制器内不工作
- Mocking console.log()/MOCHA测试框架中的任何其他函数
- 如何使用console.log在因果报应测试中检查函数
- Console.log - getElementsByClassName
- nodejs console.log of object
- 监视JavaScript输出,例如console.log()
- AngularJS:console.log不显示任何内容