捕获javascript console.log?

IT技术 javascript
2021-01-29 17:17:16

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

当我的 JS 应用程序写入console.log. 我怎么做?

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

2个回答

您可以通过以下方式劫持 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

@zzzzBov 有趣。我假设分配console._oldLog = console.log; console._oldLog(message);会起作用,但如果console它本身是一个托管对象,则不能保证任何更改都保持不变。不幸的是,我没有 IE 来测试这个了。
2021-03-17 17:17:16
@GuilhermeNascimento 提出了一个很好的观点。你如何保留原始日志行?
2021-03-19 17:17:16
是的,你仍然可以_oldLog那样打电话oldLog = Function.prototype.bind.call(console.log, console)适用于 IE9+,但随后需要一个Function.prototype.bind用于 IE8 及以下的 polyfill
2021-03-27 17:17:16
这种方法的问题是我们无法捕获日志行,它总是发送相同的行。有可能解决这个问题吗?谢谢
2021-04-10 17:17:16

简单的:

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

window.console.log = yourCustomLog;

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

window.console = {
  log : function(msg) {...},
  info : function(msg) {...},
  warn : function(msg) {...},
  //...
}
@Luillyfe 但它似乎确实有效。那么你的评论实际上暗示了什么?
2021-03-31 17:17:16
您不能使用 window.console = { ... } 因为 window.console 是只读属性!
2021-04-03 17:17:16