捕获javascript console.log?

bev*_*anb 69 javascript

可能重复:
在Chrome中拦截对console.log的调用
我可以在javascript中扩展控制台对象(用于重新路由日志记录)吗?

当我的JS应用程序写入console.log时,我想捕获该日志消息,以便我可以将AJAX记录输出到服务器.我怎么做?

写入日志的代码来自外部服务,这就是我不能直接使用它的原因.

Bri*_*kel 144

您可以通过以下方式劫持JavaScript函数:

(function(){
    var oldLog = console.log;
    console.log = function (message) {
        // DO MESSAGE HERE.
        oldLog.apply(console, arguments);
    };
})();
Run Code Online (Sandbox Code Playgroud)
  1. 第1行将您的函数包装在一个闭包中,因此没有其他函数可以直接访问oldLog(出于可维护性的原因).
  2. 第2行捕获原始方法.
  3. 第3行创建了一个新功能.
  4. 第4行是您发送message到服务器的位置.
  5. 第5行调用最初处理的原始方法.

apply使用这样我们就可以调用它 console使用原来的参数.简单地调用oldLog(message)会失败,因为它log取决于它的关联console.


更新下面的每个zzzzBov的评论,在IE9 console.log中实际上并不是一个函数,所以oldLog.apply会失败.有关更多详细信息,请参阅console.log.apply无法在IE9中运行.

  • 这种方法的问题是我们无法捕获日志行,它总是发送相同的行.有可能解决这个问题吗?谢谢 (8认同)

Tom*_*icz 19

简单:

function yourCustomLog(msg) {
  //send msg via AJAX
}

window.console.log = yourCustomLog;
Run Code Online (Sandbox Code Playgroud)

您可能希望覆盖console要捕获的整个对象console.info,console.warn例如:

window.console = {
  log : function(msg) {...},
  info : function(msg) {...},
  warn : function(msg) {...},
  //...
}
Run Code Online (Sandbox Code Playgroud)

  • @Luillyfe 但它似乎确实有效。那么你的评论实际上暗示了什么? (4认同)
  • 您不能使用 window.console = { ... } 因为 window.console 是只读属性! (2认同)

归档时间:

查看次数:

69789 次

最近记录:

7 年,2 月 前