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

Zac*_*urt 231 javascript debugging console

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

Sol*_*ogi 398

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

console.log = function() {}
Run Code Online (Sandbox Code Playgroud)

就是这样,没有更多的消息来控制台.

编辑:

扩展了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!');
    }
 );
Run Code Online (Sandbox Code Playgroud)

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

  • 多么可怕的解决方案。修改`console.log`... 为什么不只是有一个布尔值和一个用于记录的条件函数? (6认同)
  • 这是一个有趣的解决方案。我只需要暂时禁用 console.warn() ,这很完美。 (4认同)
  • console.log = function(){}似乎在Firefox中不起作用.您仍然会收到"未定义控制台"错误. (3认同)
  • 为什么最糟糕的黑客修复是这里的最高评论? (2认同)

mwi*_*cox 71

以下是更彻底的:

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(){};
    }
}
Run Code Online (Sandbox Code Playgroud)

这将使控制台中的常用方法归零(如果存在),并且可以无错误地调用它们,并且几乎不会产生性能开销.对于像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(){};
    }
}
Run Code Online (Sandbox Code Playgroud)


Cid*_*ide 26

据我可以从告诉文档,萤火虫不提供任何变量来切换调试状态.相反,将console.log()包装在有条件地调用它的包装中,即:

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

要不必更改所有现有呼叫,您可以使用此代码:

DEBUG = true; // set to false to disable debugging
old_console_log = console.log;
console.log = function() {
    if ( DEBUG ) {
        old_console_log.apply(this, arguments);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您在编辑器中具有良好的查找/替换功能,这也是正确的方法. (3认同)
  • 至少如果您使用jQuery,则无需编写自己的包装器,顺便说一句。jQuery调试插件效果很好。此外,它还提供了在没有浏览器的情况下在控制台上模拟console.log的功能。http://trainofthoughts.org/blog/2007/03/16/jquery-plugin-debug/ (2认同)

ist*_*iuk 15

你不应该!

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

正如一些人所建议的那样,您可以DEBUG_MODE有条件地定义变量和日志.根据代码的复杂性和性质,编写自己的记录器对象/函数可能是一个好主意,该对象/函数包含控制台对象并具有内置的此功能.那将是处理仪器的合适场所.

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

  • `"你使用的其他库可以恢复你的更改"`:如果我在一开始就禁用`console.log`,它们就无法恢复到旧的功能.好吧,他们可以重写`console.log`源代码,但为什么呢?`"编写自己的记录器对象/函数来包装控制台对象可能是一个好主意"`:我过去做过这个,这是个坏主意.控制台输出的跟踪是指包装器而不是调用它的行,这使得调试更加困难. (6认同)
  • @LucasMalor"一开始"意味着代码耦合到该基础结构,从而限制了它的可重用性.但是很难概括; 在游戏中,一些DOM动画与复杂SPA中的域逻辑不同,后者不应该是浏览器感知的,更不用说知道一些叫做"控制台"的东西了.在这种情况下,你应该有一个适当的测试策略,而不是黑客攻击一些`console.log('看,它到达这一点');`在你的代码中,当其他一切都失败时,你确实可以使用`debugger;`指令. (3认同)
  • @MarcoSulla我认为他正在编写更清晰的代码.说"......你不应该使用JS"有点沉重.理想情况下,作为程序员,无论您的环境如何,您都应该尽可能模块化; 如果它不关心浏览器,那么你可以在更多的地方部署它:这是一个不用担心破坏你的东西的依赖.所以,恕我直言,他确实是对的.请记住,您首先会说"如果您创建一个通用的基本模板......",它本身就会引入依赖关系.这种想法使软件复杂化.值得深思. (3认同)

Joe*_*ley 14

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

(function (original) {
    console.enableLogging = function () {
        console.log = original;
    };
    console.disableLogging = function () {
        console.log = function () {};
    };
})(console.log);
Run Code Online (Sandbox Code Playgroud)


Sco*_*eld 12

我知道你问过如何禁用console.log,但这可能是你真正想要的.这样您就不必显式启用或禁用控制台.它只是为那些没有打开或安装它的人防止那些讨厌的控制台错误.

if(typeof(console) === 'undefined') {
    var console = {};
    console.log = console.error = console.info = console.debug = console.warn = console.trace = console.dir = console.dirxml = console.group = console.groupEnd = console.time = console.timeEnd = console.assert = console.profile = function() {};
}
Run Code Online (Sandbox Code Playgroud)

  • 对于 IE 特定的日志禁用,请参阅 Chris S. 回答。 (2认同)

Swa*_*dhi 11

只需更改标志DEBUG即可覆盖console.log函数.这应该可以解决问题.

var DEBUG = false;
// ENABLE/DISABLE Console Logs
if(!DEBUG){
  console.log = function() {}
}
Run Code Online (Sandbox Code Playgroud)

  • 我更进一步,将其包装在记录器函数/类中.像这样:`function myLog(msg){if(debug){console.log(msg); } (2认同)

Xav*_*r13 9

我很惊讶所有那些没有人结合的答案:

  • 没有jquery
  • 匿名函数不污染全局命名空间
  • 处理window.console未定义的情况
  • 只需修改控制台的.log功能即可

我会这样做:

(function () {

    var debug = false

    if (debug === false) {
        if ( typeof(window.console) === 'undefined') { window.console = {}; }
        window.console.log = function () {};
    }
})()
Run Code Online (Sandbox Code Playgroud)


Chr*_*s S 8

如果您使用的是IE7,则不会定义控制台.所以更友好的IE版本将是:

if (typeof console == "undefined" || typeof console.log == "undefined") 
{
   var console = { log: function() {} }; 
}
Run Code Online (Sandbox Code Playgroud)


gra*_*uit 8

在我搜索了这个问题以及在我的cordova应用程序中尝试过之后,我只是想警告每个开发人员都不要覆盖Windows手机

    console.log
Run Code Online (Sandbox Code Playgroud)

因为应用程序会在启动时崩溃.

如果你是幸运的话,如果你正在开发本地,它不会崩溃,但是在商店中提交会导致应用程序崩溃.

只是覆盖

    window.console.log 
Run Code Online (Sandbox Code Playgroud)

如果你需要.

这在我的应用程序中有效:

   try {
        if (typeof(window.console) != "undefined") {
            window.console = {};
            window.console.log = function () {
            };
            window.console.info = function () {
            };
            window.console.warn = function () {
            };
            window.console.error = function () {
            };
        }

        if (typeof(alert) !== "undefined") {
            alert = function ()
            {

            }
        }

    } catch (ex) {

    }
Run Code Online (Sandbox Code Playgroud)


Ved*_*ran 6

如果您使用Webpack,您可以使用Terser 插件来完全排除console.log函数调用。

这样,您就可以拥有一个干净的生产应用程序包,该包不会暴露不必要的信息,但仍然在调试版本中包含所有这些信息。

https://github.com/terser/terser#compress-options

drop_console (默认值: false) -- 传递 true 以放弃对 console.* 函数的调用。如果您希望删除特定的函数调用(例如 console.info)和/或在删除函数调用后保留函数参数的副作用,请改用 pure_funcs。

minimizer: [
    new TerserPlugin({
        terserOptions: {
            compress: {
                pure_funcs: [ 'console.log' ]
            }
        }
    }),
]
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用drop_console: true排除所有控制台调用。


Zuk*_*uks 6

这是我刚刚研究的一个相当详尽的解决方案。我从https://developer.mozilla.org/en-US/docs/Web/API/console介绍了所有完全支持的控制台方法

1.创建js文件“logger.js”并在其中放入以下代码

logger = {
    assert: function() {
        if(logger.active && logger.doAssert) {
            console.assert.apply(null,arguments);
        }
    },
    clear: function() {
        if(logger.active && logger.doClear) {
            console.clear();
        }
    },
    count: function() {
        if(logger.active && logger.doCount) {
            console.count.apply(null,arguments);
        }
    },
    countReset: function() {
        if(logger.active && logger.doCountReset) {
            console.countReset.apply(null,arguments);
        }
    },
    debug: function() {
        if(logger.active && logger.doDebug) {
            console.debug.apply(null,arguments);
        }
    },
    dir: function() {
        if(logger.active && logger.doDir) {
            console.dir.apply(null,arguments);
        }
    },
    dirxml: function() {
        if(logger.active && logger.doDirxml) {
            console.dirxml.apply(null,arguments);
        }
    },
    error: function() {
        if(logger.active && logger.doError) {
            console.error.apply(null,arguments);
        }
    },
    group: function() {
        if(logger.active && logger.doGroup) {
            console.group.apply(null,arguments);
        }
    },
    groupCollapsed: function() {
        if(logger.active && logger.doGroup) {
            console.groupCollapsed.apply(null,arguments);
        }
    },
    groupEnd: function() {
        if(logger.active && logger.doGroup) {
            console.groupEnd.apply(null,arguments);
        }
    },
    info: function() {
        if(logger.active && logger.doInfo) {
            console.info.apply(null,arguments);
        }
    },
    log: function() {
        if(logger.active && logger.doLog) {
            console.log.apply(null,arguments);
        }
    },
    table: function() {
        if(logger.active && logger.doTable) {
            console.table.apply(null,arguments);
        }
    },
    time: function() {
        if(logger.active && logger.doTime) {
            console.time.apply(null,arguments);
        }
    },
    timeEnd: function() {
        if(logger.active && logger.doTime) {
            console.timeEnd.apply(null,arguments);
        }
    },
    timeLog: function() {
        if(logger.active && logger.doTime) {
            console.timeLog.apply(null,arguments);
        }
    },
    trace: function() {
        if(logger.active && logger.doTrace) {
            console.trace.apply(null,arguments);
        }
    },
    warn: function() {
        if(logger.active && logger.doWarn) {
            console.warn.apply(null,arguments);
        }
    },
    active: true,
    doAssert: true,
    doClear: true,
    doCount: true,
    doCountReset: true,
    doDebug: true,
    doDir: true,
    doDirxml: true,
    doError: true,
    doGroup: true,
    doInfo: true,
    doLog: true,
    doTable: true,
    doTime: true,
    doTrace: true,
    doWarn: true
};
Run Code Online (Sandbox Code Playgroud)

2. 在所有页面中包含带有日志的所有脚本之前

3.更换所有“控制台”。与“记录器”。在你的脚本中

4. 使用方法

就像“控制台”一样使用。但用“记录器”。

logger.clear();
logger.log("abc");
Run Code Online (Sandbox Code Playgroud)

最后禁用部分或全部日志

//disable/enable all logs
logger.active = false; //disable
logger.active = true; //enable

//disable some logs
logger.doLog = false; //disable
logger.doInfo = false; //disable

logger.doLog = true; //enable
logger.doInfo = true; //enable

logger.doClear = false; //log clearing code will no longer clear the console.
Run Code Online (Sandbox Code Playgroud)

编辑

在我的最新项目中使用我的解决方案一段时间后,我意识到很难记住我应该使用logger.而不是console.. 因此,出于这个原因,我决定重写console. 这是我更新的解决方案:

const consoleSubstitute = console;
console = {
    assert: function() {
        if(console.active && console.doAssert) {
            consoleSubstitute.assert.apply(null,arguments);
        }
    },
    clear: function() {
        if(console.active && console.doClear) {
            consoleSubstitute.clear();
        }
    },
    count: function() {
        if(console.active && console.doCount) {
            consoleSubstitute.count.apply(null,arguments);
        }
    },
    countReset: function() {
        if(console.active && console.doCountReset) {
            consoleSubstitute.countReset.apply(null,arguments);
        }
    },
    debug: function() {
        if(console.active && console.doDebug) {
            consoleSubstitute.debug.apply(null,arguments);
        }
    },
    dir: function() {
        if(console.active && console.doDir) {
            consoleSubstitute.dir.apply(null,arguments);
        }
    },
    dirxml: function() {
        if(console.active && console.doDirxml) {
            consoleSubstitute.dirxml.apply(null,arguments);
        }
    },
    error: function() {
        if(console.active && console.doError) {
            consoleSubstitute.error.apply(null,arguments);
        }
    },
    group: function() {
        if(console.active && console.doGroup) {
            consoleSubstitute.group.apply(null,arguments);
        }
    },
    groupCollapsed: function() {
        if(console.active && console.doGroup) {
            consoleSubstitute.groupCollapsed.apply(null,arguments);
        }
    },
    groupEnd: function() {
        if(console.active && console.doGroup) {
            consoleSubstitute.groupEnd.apply(null,arguments);
        }
    },
    info: function() {
        if(console.active && console.doInfo) {
            consoleSubstitute.info.apply(null,arguments);
        }
    },
    log: function() {
        if(console.active && console.doLog) {
            if(console.doLogTrace) {
                console.groupCollapsed(arguments);
                consoleSubstitute.trace.apply(null,arguments);
                console.groupEnd();
            } else {
                consoleSubstitute.log.apply(null,arguments);
            }
        }
    },
    table: function() {
        if(console.active && console.doTable) {
            consoleSubstitute.table.apply(null,arguments);
        }
    },
    time: function() {
        if(console.active && console.doTime) {
            consoleSubstitute.time.apply(null,arguments);
        }
    },
    timeEnd: function() {
        if(console.active && console.doTime) {
            consoleSubstitute.timeEnd.apply(null,arguments);
        }
    },
    timeLog: function() {
        if(console.active && console.doTime) {
            consoleSubstitute.timeLog.apply(null,arguments);
        }
    },
    trace: function() {
        if(console.active && console.doTrace) {
            consoleSubstitute.trace.apply(null,arguments);
        }
    },
    warn: function() {
        if(console.active && console.doWarn) {
            consoleSubstitute.warn.apply(null,arguments);
        }
    },
    active: true,
    doAssert: true,
    doClear: true,
    doCount: true,
    doCountReset: true,
    doDebug: true,
    doDir: true,
    doDirxml: true,
    doError: true,
    doGroup: true,
    doInfo: true,
    doLog: true,
    doLogTrace: false,
    doTable: true,
    doTime: true,
    doTrace: true,
    doWarn: true
};
Run Code Online (Sandbox Code Playgroud)

现在您可以console.照常使用。


Jus*_*tin 5

这是来自SolutionYogiChris S.的答案的混合.它维护console.log行号和文件名.示例jsFiddle.

// Avoid global functions via a self calling anonymous one (uses jQuery)
(function(MYAPP, $, undefined) {
    // Prevent errors in browsers without console.log
    if (!window.console) window.console = {};
    if (!window.console.log) window.console.log = function(){};

    //Private var
    var console_log = console.log;  

    //Public methods
    MYAPP.enableLog = function enableLogger() { console.log = console_log; };   
    MYAPP.disableLog = function disableLogger() { console.log = function() {}; };

}(window.MYAPP = window.MYAPP || {}, jQuery));


// Example Usage:
$(function() {    
    MYAPP.disableLog();    
    console.log('this should not show');

    MYAPP.enableLog();
    console.log('This will show');
});
Run Code Online (Sandbox Code Playgroud)