有没有办法使用Javascript读取console.log的内容?

35 浏览
0 Comments

有没有办法使用Javascript读取console.log的内容?

这个标题已经很明确了。\n有没有办法使用Javascript读取在你决定读取之前已经输出到console.log的内容?

0
0 Comments

有一种方法可以使用代理来读取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,但我遇到过一些网站使用它,可能只是因为他们不喜欢它,但你说得对,我不能对此过于担心。

0