如何覆盖 console.log

Posted

技术标签:

【中文标题】如何覆盖 console.log【英文标题】:How to override console.log 【发布时间】:2013-08-12 15:03:38 【问题描述】:

我正在使用以下代码覆盖console.log 函数,因为我只想在showConsole 返回true 时打印console.log

var proxyConsolelog = window.console.log;


console.log=function(msg)
    try
        if(Boolean(showConsole))
        
            proxyConsolelog(msg);
        
    catch(e)
        alert(JSON.stringify(e.message));
        proxyConsolelog('ERROR-->>'+e.message);
    

proxyConsolelog 行产生了问题,alert(JSON.stringify(e.message)); 给了我一个“类型错误”。

我明白了:

void SendDelegateMessage(NSInvocation *): 委托 (webView:runjavascriptAlertPanelWithMessage:initiatedByFrame:) 失败 等待 10 秒后返回。主运行循环模式: kCFRunLoopDefaultMode

在日志中。

我怎样才能做到这一点?

【问题讨论】:

你试过proxyConsolelog.apply(console, arguments);吗? 我不知道showConsole 是什么,但我怀疑Boolean(showConsole) 是否有用。 【参考方案1】:

您遇到的问题是您调用函数时的接收者 (this) 不是控制台。

你可以这样做:

var proxyConsolelog = window.console.log.bind(window.console);

如果你需要兼容 IE8(没有bind),你可以这样做:

var logFun = window.console.log;
var proxyConsolelog = function()
     logFun.apply(window.console, arguments)
;

当你标记了问题jquery,那么你也可以使用proxy:

var proxyConsolelog = $.proxy(window.console.log, window.console);

一旦你有了你的新函数,你就可以像console.log一样调用它:

proxyConsolelog('some', arg:'uments');

【讨论】:

感谢哥们工作得很好!你能告诉我这里的“一些”是什么吗 不过,如果要覆盖 console.log,您的 IE8 兼容方式将不起作用。 :) (考虑到这是 Cordova,也可以不提它。) @minitech 哦,是的,我监督了最终目标,你说得对,谢谢。我已经编辑了。 @dystroy 也许是一个愚蠢的问题,但你最后一次编辑实际上做了什么?我想知道是否因为我没有使用 Cordova 的经验,所以我错过了一些明显的东西。但似乎你的最后一个编辑刚刚存储了对console.log(并调用该)而不是直接调用console.log.apply(当然,添加window.)。老实说只是想知道 以前版本的问题是proxyConsolelog动态引用window.console.log。因此,只要您更改 window.console.log,它就会发生变化(紧随其后)。

以上是关于如何覆盖 console.log的主要内容,如果未能解决你的问题,请参考以下文章

如何:获取代码覆盖率数据

你好,LABVIEW复制文件,如何做到不覆盖?

如何自动给文件命名,避免覆盖同名文件?

安卓软件升级软件如何覆盖旧版

如何在代码覆盖率报告 Laravel 8 中覆盖异常?

如何配置 SonarQube 让我们增加覆盖范围?