80

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

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

写入日志的代码来自外部服务,这就是为什么我不能直接 ajax 它。

4

2 回答 2

156

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

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

apply被使用,因此我们可以使用原始参数调用它 console简单地调用oldLog(message)会失败,因为log取决于它与console.


更新Per zzzzBov 下面的评论,在 IE9console.log中实际上不是一个函数,所以oldLog.apply会失败。有关更多详细信息,请参阅console.log.apply not working in IE9

于 2012-07-09T21:05:38.407 回答
24

简单的:

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

window.console.log = yourCustomLog;

您可能想要覆盖整个console对象来捕获console.infoconsole.warn例如:

window.console = {
  log : function(msg) {...},
  info : function(msg) {...},
  warn : function(msg) {...},
  //...
}
于 2012-07-09T21:04:42.267 回答