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


256

有什么方法可以关闭console.log我的JavaScript代码中的所有语句以进行测试?


11
使用支持“全部替换”的文本编辑器,并将“ console.log”替换为“ //console.log”
helloandre 2009年

5
@helloandre-如果您使用日志,信息,警告调试和错误,那会有点

希望我们能够达到这样的程度:除非启用了浏览器的调试工具,否则浏览器实现会自动绕过控制台语句。
faintsignal,2015年

2
下面的答案很好,但是您不必重新发明这个答案。看看picolog。它具有与(NodeJS)控制台兼容的API,因此您可以将其用作替代产品。它支持开箱即用的日志记录级别,可以在浏览器,NodeJS和Nashorn上运行,可以从querystring(浏览器)或环境变量PICOLOG_LEVEL(node)轻松配置,并且它非常小。压缩后压缩少于900字节。免责声明:我是作者。
Stijn de Witt

有一种简单的方法可以覆盖所有console功能。只需看看stapp.space/disable-javascript-console-on-production
Piotr Stapp

Answers:


426

在脚本中重新定义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。


请提供有关什么无效的详细信息?上一行是否给您错误?如果是,错误消息是什么?
解决方案

1
在IE8中为我工作。;-)
尤金·拉祖金

该代码将覆盖并还原console.log函数。如果IE7支持console.log方法,它应该可以工作。
解决方案

3
console.log = function(){}在Firefox中似乎不起作用。您仍然会收到“未定义控制台”错误。
DA。

2
多么可怕的解决方案。修改console.log...为什么不只具有布尔值和条件函数进行记录?
Dementic '17

76

以下内容更为详尽:

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(){};
    }
}

这对我来说非常有效,尽管我做了一些调整,但我检查了环境(我只希望在生产中禁用它)
Muganwas

27

据我从文档中得知,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);
    }
}

1
谢谢,尽管这意味着我需要将所有console.log语句重写为debug.log。
Zack Burt,2009年

这是正确的方法-当然,如果您是从头开始的话。
OpenSource

3
如果您在编辑器中具有良好的查找/替换功能,这也是正确的方法。
BaroqueBobcat

2
至少在使用jQuery的情况下,无需编写自己的包装器,顺便说一句。jQuery调试插件效果很好。此外,它还提供了在没有浏览器的情况下在控制台上模拟console.log的功能。 trainofthoughts.org/blog/2007/03/16/jquery-plugin-debug
尼尔森,2009年

当然,唯一的(次要)问题是您需要安装插件。:)不过,很高兴知道-谢谢!
Cide

17

你不应该!

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

如一些建议,您可以定义一个DEBUG_MODE变量并有条件地记录日志。根据代码的复杂性和性质,最好编写自己的记录程序对象/函数,该对象环绕控制台对象并内置此功能。那将是处理仪器的正确地方。

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


7
"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":我过去已经这样做过,这是个坏主意。控制台输出的跟踪指向包装程序,而不是调用包装程序的行,这使调试更加困难。
Marco Sulla

3
@LucasMalor“从一开始”就意味着代码已与该基础架构耦合,从而限制了其可重用性。但是很难一概而论。游戏中,某些DOM动画与复杂SPA中的域逻辑不同,后者不应该具有浏览器意识,更不用说了解“控制台”了。在这种情况下,您应该有一个适当的测试策略,而不是乱砍console.log('Look ma, it reaches this point');代码中的某些内容,否则,您可以使用该debugger;指令。
istepaniuk

"the code is coupled to that infrastructure":可能是代码,但模式不是。如果您为禁用了日志功能的页面创建一个通用的基本模板,那么这是一种逻辑,您可以将其应用于所有地方。"the later shouldn't be browser-aware":好,所以你不应该使用JS:P
Marco Sulla

3
@MarcoSulla我认为他正在编写更简洁的代码。说“ ....您不应该使用JS”有点笨拙。理想情况下,作为程序员,无论您的环境如何,都应尽可能地模块化。如果它不关心浏览器,那么您可以将其部署在更多地方:不必担心会破坏您的东西。所以,恕我直言,是的,他实际上是对的。请记住,您首先要说“如果您创建一个通用的基本模板...”,它本身就引入了依赖性。这种想法使软件变得复杂。值得深思。
dudewad

1
Adobe SiteCatalyics在我的控制台中抛出了很多垃圾,并且在某些情况下调试很麻烦。因此,能够在执行第三方调用时暂时禁用console.log对我来说非常有用
旋转

16

我意识到这是一篇过时的文章,但仍然出现在Google搜索结果的顶部,因此这里有一个更优雅的非jQuery解决方案,可在最新的Chrome,FF和IE中使用。

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

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() {};
}

2
对于IE特定的日志记录禁用,请参阅Chris S.答案。
GuruM

11

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

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

2
我将更进一步,并将其包装在记录器函数/类中。像这样的东西:function myLog(msg) { if (debug) { console.log(msg); } }
sleblanc

如果使用Angular,则可以将其用作application.js文件中的全局配置,并将其用作全局属性以打开/关闭日志。请记住,如果您在IE中打开了开发人员工具栏,则控制台不会是未定义的。
斯瓦尼迪

10

令我惊讶的是,在所有这些答案中,没有人将其结合在一起:

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

我会为此:

(function () {

    var debug = false

    if (debug === false) {
        if ( typeof(window.console) === 'undefined') { window.console = {}; }
        window.console.log = function () {};
    }
})()

9

在我也搜索了此问题并在我的cordova应用程序中尝试了此问题之后,我只想警告Windows Phone的每个开发人员不要覆盖

    console.log

因为该应用将在启动时崩溃。

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

只是覆盖

    window.console.log 

如果你需要。

这适用于我的应用程序:

   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) {

    }

谢谢你的提醒”。但是,我已将基于Cordova的应用发布到GooglePlay商店,并通过电话设备对其进行了测试,一切都很好。我可以假设您的警告仅限于“基于Windows的”应用商店?...但是,最好将操作部件放入try-catch支架中,以防万一其爆炸。因此,竖起大拇指。
帕尼尼午餐者

8

如果您使用的是IE7,则不会定义控制台。因此,对IE更友好的版本是:

if (typeof console == "undefined" || typeof console.log == "undefined") 
{
   var console = { log: function() {} }; 
}

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');
});


3

香港专业教育学院一直在使用以下方法来解决他的问题:

var debug = 1;
var logger = function(a,b){ if ( debug == 1 ) console.log(a, b || "");};

将debug设置为1以启用调试。然后在输出调试文本时使用记录器功能。它还设置为接受两个参数。

所以,代替

console.log("my","log");

logger("my","log");

3

我以前使用过winston logger。

如今,我正在使用以下来自经验的简单代码:

  1. 通过cmd /命令行设置环境变量(在Windows上):

    cmd
    setx LOG_LEVEL info

或者,您可以根据需要在代码中包含一个变量,但是上面的方法更好。

  1. 重新启动cmd /命令行,或者重新启动IDE /编辑器(如Netbeans)

  2. 下面有类似的代码:

    console.debug = console.log;   // define debug function
    console.silly = console.log;   // define silly function
    
    switch (process.env.LOG_LEVEL) {
        case 'debug':
        case 'silly':
            // print everything
            break;
    
        case 'dir':
        case 'log':
            console.debug = function () {};
            console.silly = function () {};
            break;
    
        case 'info':
            console.debug = function () {};
            console.silly = function () {};
            console.dir = function () {};
            console.log = function () {};
            break;
    
        case 'trace':   // similar to error, both may print stack trace/ frames
        case 'warn':    // since warn() function is an alias for error()
        case 'error':
            console.debug = function () {};
            console.silly = function () {};
            console.dir = function () {};
            console.log = function () {};
            console.info = function () {};
            break;
    }
  3. 现在使用所有控制台。*,如下所示:

    console.error(' this is a error message '); // will print
    console.warn(' this is a warn message '); // will print
    console.trace(' this is a trace message '); // will print
    console.info(' this is a info message '); // will print, LOG_LEVEL is set to this
    
    console.log(' this is a log message '); // will NOT print
    console.dir(' this is a dir message '); // will NOT print
    console.silly(' this is a silly message '); // will NOT print
    console.debug(' this is a debug message '); // will NOT print

现在,根据您在第1点所做的LOG_LEVEL设置(例如,setx LOG_LEVEL log并重新启动命令行),上面的某些内容将打印,其他内容将不会打印

希望能有所帮助。


2

警告:无耻的插头!

您还可以使用JsTrace对象之类的东西来进行模块化跟踪,并具有模块级别的“切换”功能,以仅打开您当时想要看到的内容。

http://jstrace.codeplex.com

(也有一个NuGet包,供那些关心的人使用)

所有级别默认为“错误”,尽管您可以将它们“关闭”。不过,我无法想到您为什么不想看到错误

您可以这样更改它们:

Trace.traceLevel('ModuleName1', Trace.Levels.log);
Trace.traceLevel('ModuleName2', Trace.Levels.info);

有关更多文档,请查看文档

Ť


2

我在该URL JavaScript技巧中找到了一些更高级的代码:胸围和禁用console.log

var DEBUG_MODE = true; // Set this value to false for production

if(typeof(console) === 'undefined') {
   console = {}
}

if(!DEBUG_MODE || typeof(console.log) === 'undefined') {
   // FYI: Firebug might get cranky...
   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() {};
}

2

我为此用例开发了一个库:https : //github.com/sunnykgupta/jsLogger

特征:

  1. 它安全地覆盖console.log。
  2. 注意控制台是否不可用(哦,是的,您也需要考虑这一点。)
  3. 存储所有日志(即使已被抑制),以备以后检索。
  4. 手柄主要控制台的功能,如logwarnerrorinfo

开放供修改,只要有新建议就会更新。


2

这应该覆盖window.console的所有方法。您可以将其放在脚本部分的最顶部,如果您使用的是PHP框架,则只能在生产应用程序环境或禁用某种调试标志时打印此代码。这样,您就可以将所有日志记录在开发环境或调试模式下的代码中。

window.console = (function(originalConsole){
    var api = {};
    var props = Object.keys(originalConsole);
    for (var i=0; i<props.length; i++) {
        api[props[i]] = function(){};
    }
    return api;
})(window.console);

1

我这样写:

//Make a copy of the old console.
var oldConsole = Object.assign({}, console);

//This function redefine the caller with the original one. (well, at least i expect this to work in chrome, not tested in others)
function setEnabled(bool) {
    if (bool) {
        //Rewrites the disable function with the original one.
        console[this.name] = oldConsole[this.name];
        //Make sure the setEnable will be callable from original one.
        console[this.name].setEnabled = setEnabled;
    } else {
        //Rewrites the original.
        var fn = function () {/*function disabled, to enable call console.fn.setEnabled(true)*/};
        //Defines the name, to remember.
        Object.defineProperty(fn, "name", {value: this.name});
        //replace the original with the empty one.
        console[this.name] = fn;
        //set the enable function
        console[this.name].setEnabled = setEnabled

    }
}

不幸的是,它在严格模式下不起作用。

因此,使用console.fn.setEnabled = setEnabled,然后console.fn.setEnabled(false)在那里fn几乎可以是任何控制台功能。对于您的情况将是:

console.log.setEnabled = setEnabled;
console.log.setEnabled(false);

我也是这样写的:

var FLAGS = {};
    FLAGS.DEBUG = true;
    FLAGS.INFO = false;
    FLAGS.LOG = false;
    //Adding dir, table, or other would put the setEnabled on the respective console functions.

function makeThemSwitchable(opt) {
    var keysArr = Object.keys(opt);
    //its better use this type of for.
    for (var x = 0; x < keysArr.length; x++) {
        var key = keysArr[x];
        var lowerKey = key.toLowerCase();
        //Only if the key exists
        if (console[lowerKey]) {
            //define the function
            console[lowerKey].setEnabled = setEnabled;
            //Make it enabled/disabled by key.
            console[lowerKey].setEnabled(opt[key]);
        }
    }
}
//Put the set enabled function on the original console using the defined flags and set them.
makeThemSwitchable(FLAGS);

因此,您只需要FLAGS输入默认值(在执行上面的代码之前),例如FLAGS.LOG = false,默认情况下将禁用log函数,并且仍然可以启用它调用console.log.setEnabled(true)


您认为这可用于在生产环境中即时启用console.log吗?像打开Chrome控制台一样,运行console.log.setEnabled(true)并开始查看日志
Rodrigo Assis

1
@RodrigoAssis是的,它将起作用。我创建此程序只是为了不丢失呼叫者线路并在任何地方启用它,但这并不是最好的方法。记录日志的最佳方法是使用类似以下的短路方法:var debug = false; debug && console.log(1/3)因为如果未启用日志,则无需评估日志内容(在这种情况下1/3将不会进行评估),请不要丢失呼叫者线路并可以启用它也很容易(如果不将vars作为const)。
加布里埃尔·德奥利维拉·罗登

1

在这里禁用/覆盖所有console.*功能的综合解决方案。

当然,请在检查必要的上下文后确保将其包括在内。例如,仅包括在生产版本中,它不会轰炸任何其他关键组件等。

在这里引用:

"use strict";
(() => {
  var console = (window.console = window.console || {});
  [
    "assert", "clear", "count", "debug", "dir", "dirxml",
    "error", "exception", "group", "groupCollapsed", "groupEnd",
    "info", "log", "markTimeline", "profile", "profileEnd", "table",
    "time", "timeEnd", "timeStamp", "trace", "warn"
  ].forEach(method => {
    console[method] = () => {};
  });
  console.log("This message shouldn't be visible in console log");
})();


1

如果您正在使用gulp,则可以使用以下插件:

使用以下命令安装此插件:

npm install gulp-remove-logging

接下来,将此行添加到您的gulpfile中:

var gulp_remove_logging = require("gulp-remove-logging");

最后,将配置设置(请参见下文)添加到您的gulpfile中。

任务配置

gulp.task("remove_logging", function() {
     return gulp.src("src/javascripts/**/*.js")
    .pipe(
      gulp_remove_logging()
    )
    .pipe(
      gulp.dest(
        "build/javascripts/"
      )
    ); });

1

https://stackoverflow.com/a/46189791/871166的简化

switch (process.env.LOG_LEVEL) {
  case 'ERROR':
    console.warn = function() {};
  case 'WARN':
    console.info = function() {};
  case 'INFO':
    console.log = function() {};
  case 'LOG':
    console.debug = function() {};
    console.dir = function() {};
}

0

您可以使用javascript AOP(例如jquery-aop)来拦截对console.debug / log(左右)的所有调用,并且如果某些全局变量设置为false,则不进行实际调用。

您甚至可以(不时地)进行ajax调用,以便可以更改服务器上启用/禁用日志的行为,这对于在暂存环境等中遇到问题时启用调试非常有意思。


我尚未实现这种解决方案,没有看到它。到目前为止是理论上的。
Stijn Geukens

0

您可以使用logeek,它可以控制日志消息的可见性。这是您的操作方式:

<script src="bower_components/dist/logeek.js"></script>

logeek.show('security');

logeek('some message').at('copy');       //this won't be logged
logeek('other message').at('secturity'); //this would be logged

您也logeek.show('nothing')可以完全禁用每条日志消息。


0

在对该问题进行了一些研究和开发之后,我遇到了该解决方案,该解决方案将根据您的选择隐藏警告/错误/日志。

    (function () {
    var origOpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function () {        
        console.warn = function () { };
        window['console']['warn'] = function () { };
        this.addEventListener('load', function () {                        
            console.warn('Something bad happened.');
            window['console']['warn'] = function () { };
        });        
    };
})();

将此代码添加到JQuery插件(例如/../jquery.min.js)之前,即使这是不需要JQuery的JavaScript代码。因为JQuery本身包含一些警告。

谢谢!!


0

我写了一个ES2015解决方案(仅与Webpack一起使用)。

class logger {
  static isEnabled = true;

  static enable () {
    if(this.constructor.isEnabled === true){ return; }

    this.constructor.isEnabled = true;
  }

  static disable () {
    if(this.constructor.isEnabled === false){ return; }

    this.constructor.isEnabled = false;
  }

  static log () {
    if(this.constructor.isEnabled === false ) { return; }

    const copy = [].slice.call(arguments);

    window['console']['log'].apply(this, copy);
  }

  static warn () {
    if(this.constructor.isEnabled === false ) { return; }

    const copy = [].slice.call(arguments);

    window['console']['warn'].apply(this, copy);
  }

  static error () {
    if(this.constructor.isEnabled === false ) { return; }

    const copy = [].slice.call(arguments);

    window['console']['error'].apply(this, copy);
  }
}

描述:

  1. 除了logger.enable和logger.disable外,您还可以使用console。['log','warn','error']方法以及使用logger类。
  2. 通过使用记录器类来显示,启用或禁用消息,可使代码更清晰和可维护。
  3. 下面的代码向您展示如何使用logger类:
    • logger.disable() -禁用所有控制台消息
    • logger.enable() -启用所有控制台消息
    • logger.log('message1', 'message2') -完全类似于console.log。
    • logger.warn('message1', 'message2') -完全类似于console.warn。
    • logger.error('message1', 'message2')-就像console.error一样工作。快乐的编码
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.