有没有办法使用Javascript读取console.log的内容?
有一种方法可以使用代理来读取console.log,如下所示:
(function(win){
var ncon = win.console;
var con = win.console = {
backlog: []
};
for(var k in ncon) {
if(typeof ncon[k] === 'function') {
con[k] = (function(fn) {
return function() {
con.backlog.push([new Date(), fn, arguments]);
ncon[fn].apply(ncon, arguments);
};
})(k);
}
}
})(window);
但是,我必须足够快地覆盖console,以防止一些脚本开始使用它之前,否则我将丢失该脚本在我开始覆盖console之前记录的所有内容。此外,如果一个脚本使用"delete console;",我的覆盖将会丢失,对吗?所以,我需要设置一个间隔来不断覆盖console,希望在这些间隔之间不会丢失任何日志,对吗?
我不认为你实际上可以循环遍历console的属性。
: "delete console;"不是常见的代码行。如果一个脚本这样做,我会担心它还在做什么。我不会浪费时间去设置一个间隔。至于"足够快",只需把这个作为页面上的第一个脚本加载,这样你就可以确保它是第一个。
for(var k in console) if(typeof console[k] === 'function') console.log(k)
在Chrome中似乎至少可以工作。
:之前出于某种原因它对我不起作用。这次有效了 🙂
在任何给定的时刻,只有一段代码正在运行,除非你使用异步的东西(主要是xhr),如果在任何其他代码之前添加这段代码,你就可以放心了。
我当然可以这样覆盖console:var arrayLog = []; console.log = function (x) {arrayLog.push(x);};
。然而,如果在日志记录过程中,某个脚本使用delete console;
,我的赋值将丢失,所以我需要var grabConsole = setInterval(function (){console.log = function (x) {arrayLog.push(x);};},30);
我之前检查了typeof k
而不是typeof ncon[k]
,我的错误。
:就像我说的,我真的不会担心delete console;
。
如果一个脚本试图删除console,那么肯定有很大的问题。
我在网页分析方面工作,经常遇到异步标签。老实说,我从来没有见过外部标签使用delete console,但我遇到过一些网站使用它,可能只是因为他们不喜欢它,但你说得对,我不能对此过于担心。