如何快速方便地禁用我代码中的所有 console.log 语句?

IT技术 javascript debugging console
2021-01-28 15:20:28

有没有办法关闭console.log我的 JavaScript 代码中的所有语句,以进行测试?

6个回答

在脚本中重新定义 console.log 函数。

console.log = function() {}

就是这样,没有更多的消息要控制台。

编辑:

扩展 Cide 的想法。一个自定义记录器,您可以使用它来切换代码中的日志记录开/关。

从我的 Firefox 控制台:

var logger = function()
{
    var oldConsoleLog = null;
    var pub = {};

    pub.enableLogger =  function enableLogger() 
                        {
                            if(oldConsoleLog == null)
                                return;

                            window['console']['log'] = oldConsoleLog;
                        };

    pub.disableLogger = function disableLogger()
                        {
                            oldConsoleLog = console.log;
                            window['console']['log'] = function() {};
                        };

    return pub;
}();

$(document).ready(
    function()
    {
        console.log('hello');

        logger.disableLogger();
        console.log('hi', 'hiya');
        console.log('this wont show up in console');

        logger.enableLogger();
        console.log('This will show up!');
    }
 );

如何使用上面的“记录器”?在您的就绪事件中,调用 logger.disableLogger 以便不记录控制台消息。在要将消息记录到控制台的方法中添加对 logger.enableLogger 和 logger.disableLogger 的调用。

请详细说明什么不起作用?上面的行是否给您一个错误?如果是,错误信息是什么?
2021-03-11 15:20:28
多么可怕的解决方案。修改console.log......为什么不只是有一个布尔值和一个用于记录的条件函数?
2021-03-26 15:20:28
代码覆盖并恢复了console.log 功能。如果 IE7 支持 console.log 方法,它应该可以工作。
2021-03-28 15:20:28
console.log = function() {} 在 Firefox 中似乎不起作用。您仍然会收到“控制台未定义”错误。
2021-03-28 15:20:28
Firefox 20.0.1 会记录所有内容,即使它应该在您的代码中被禁用
2021-04-02 15:20:28

下面是更彻底的:

var DEBUG = false;
if(!DEBUG){
    if(!window.console) window.console = {};
    var methods = ["log", "debug", "warn", "info"];
    for(var i=0;i<methods.length;i++){
        console[methods[i]] = function(){};
    }
}

如果存在,这会将控制台中的常用方法归零,并且可以毫无错误地调用它们并且几乎没有性能开销。在没有控制台的 IE6 浏览器的情况下,将创建虚拟方法以防止错误。当然,Firebug 中还有更多功能,如跟踪、配置文件、时间等。如果您在代码中使用它们,可以将它们添加到列表中。

您还可以检查调试器是否具有这些特殊方法(即 IE)并将其不支持的方法归零:

if(window.console && !console.dir){
var methods = ["dir", "dirxml", "trace", "profile"]; //etc etc
    for(var i=0;i<methods.length;i++){
        console[methods[i]] = function(){};
    }
}
这对我很有效,虽然我稍微调整了一下,但我检查了环境(我只希望在生产中禁用它)
2021-03-22 15:20:28

据我从文档中得知,Firebug 不提供任何变量来切换调试状态。相反,将 console.log() 包装在有条件调用它的包装器中,即:

DEBUG = true; // set to false to disable debugging
function debug_log() {
    if ( DEBUG ) {
        console.log.apply(this, arguments);
    }
}

为了不必更改所有现有调用,您可以使用它:

DEBUG = true; // set to false to disable debugging
old_console_log = console.log;
console.log = function() {
    if ( DEBUG ) {
        old_console_log.apply(this, arguments);
    }
}
当然,唯一的 [次要] 问题是您需要安装插件。:) 不过很高兴知道 - 谢谢!
2021-03-13 15:20:28
如果您的编辑器中具有良好的查找/替换功能,这也是正确的方法。
2021-03-18 15:20:28
谢谢,尽管这意味着我需要将所有 console.log 语句重写为 debug.log。
2021-03-19 15:20:28
不需要编写自己的包装器,顺便说一句,至少如果您使用 jQuery。jQuery 调试插件效果很好。作为奖励,它在没有它的浏览器上提供了对 console.log 的模拟。 trainofthoughts.org/blog/2007/03/16/jquery-plugin-debug
2021-03-25 15:20:28
这是正确的方法 - 当然,如果您是从头开始。
2021-04-04 15:20:28

你不应该!

覆盖内置函数不是一个好习惯。也不能保证您会抑制所有输出,您使用的其他库可能会恢复您的更改,并且还有其他函数可能会写入控制台;.dir().warning().error().debug().assert()等。

正如一些人所建议的,您可以定义一个DEBUG_MODE变量并有条件地记录。根据代码的复杂性和性质,编写自己的记录器对象/函数来封装控制台对象并内置此功能可能是个好主意。那将是处理仪器的正确位置

也就是说,出于“测试”目的,您可以编写测试而不是打印到控制台。如果您不进行任何测试,并且这些console.log()行只是帮助您编写代码,只需删除它们即可

Adobe SiteCatalyics 在我的控制台中抛出了很多垃圾,并且在某些情况下会给调试带来麻烦。因此,当我执行第三方调用时能够暂时禁用 console.log 对我来说非常有用
2021-03-16 15:20:28
"other libraries you use may revert your changes": 如果我console.log一开始就禁用,他们将无法恢复到旧功能。好吧,他们可以重写console.log源代码,但为什么呢?"it may be a good idea to write your own logger object/function that wraps around the console object": 我过去做过这个,这是一个坏主意。控制台输出的跟踪指的是包装器而不是调用它的行,这使得调试更加困难。
2021-03-29 15:20:28
@LucasMalor“一开始”意味着代码与该基础设施耦合,从而限制了其可重用性。但是很难一概而论;一个游戏,一些 DOM 动画和复杂 SPA 中的域逻辑不一样,后者不应该是浏览器感知的,更不用说知道一个叫做“控制台”的东西了。在这种情况下,你应该有一个适当的测试策略,而不是console.log('Look ma, it reaches this point');在你的代码中修改一些,当其他一切都失败时,你确实可以使用该debugger;指令。
2021-03-30 15:20:28
@MarcoSulla 我认为他正在编写更简洁的代码。说“....你不应该使用 JS”有点笨手笨脚。理想情况下,作为程序员,无论您的环境是什么,都应该尽可能地module化;如果它不关心浏览器,那么你可以将它部署在更多的地方:这样就不用担心破坏你的东西了。所以,恕我直言,是的,他实际上是对的。请记住,您一开始就说“如果您创建一个通用的基本模板...”,这本身就引入了依赖项。这种想法使软件复杂化。深思熟虑。
2021-04-09 15:20:28
"the code is coupled to that infrastructure": 可能是代码,但模式不是。如果您为禁用日志记录功能的页面创建了一个通用的基本模板,那么这是一个可以在任何地方应用的逻辑。"the later shouldn't be browser-aware": 好吧,所以你不应该使用 JS :P
2021-04-10 15:20:28

我意识到这是一篇旧帖子,但它仍然出现在 Google 结果的顶部,所以这里有一个更优雅的非 jQuery 解决方案,适用于最新的 Chrome、FF 和 IE。

(function (original) {
    console.enableLogging = function () {
        console.log = original;
    };
    console.disableLogging = function () {
        console.log = function () {};
    };
})(console.log);