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

有没有什么办法可以closuresJavaScript代码中的所有console.log语句,用于testing目的?

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

 console.log = function() {} 

就是这样,没有更多的信息来控制。

编辑:

扩大Cide的想法。 自定义logging器,您可以使用它来从代码中打开/closureslogging。

从我的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!'); } ); 

如何使用上面的“logging器”? 在您准备好的事件中,请调用logger.disableLogger,以便不logging控制台消息。 将要调用的logger.enableLogger和logger.disableLogger添加到要将消息logging到控制台的方法中。

以下更全面:

 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浏览器的情况下,将创build虚拟方法来防止错误。 当然,Firebug中还有更多的function,比如跟踪,configuration文件,时间等。如果你在代码中使用它们,它们可以被添加到列表中。

您也可以检查debugging器是否具有这些特殊的方法(即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(){}; } } 

据我可以从文档中知道,Firebug不提供任何variables来切换debugging状态。 而是将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); } } 

我知道你问了如何禁用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() {}; } 

我意识到这是一个旧的post,但它仍然popup在谷歌search结果的顶部,所以这是一个更优雅的非jQuery解决scheme,在最新的Chrome,FF和IE工作。

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

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

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

你不应该!

重写内置函数并不是一个好习惯。 也不保证你会压制所有的输出,你使用的其他库可能会恢复你的改变,还有其他的function可以写入控制台; .dir() .warning() .assert()

正如一些build议,你可以定义一个DEBUG_MODEvariables并有条件地logging日志。 根据代码的复杂性和性质,编写自己的包含控制台对象的logging器对象/函数可能是一个好主意,并且具有内置的此function。 那将是处理仪器的正确的地方。

这就是说,为了“testing”的目的,你可以写testing,而不是打印到控制台。 如果您没有进行任何testing,那些console.log()行只是帮助您编写代码, 只需将其删除即可

只需更改标志DEBUG以覆盖console.log函数。 这应该做的伎俩。

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

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

  • 没有jquery
  • 匿名函数不污染全局名称空间
  • 处理window.console未定义的情况
  • 只要修改控制台的.logfunction

我会去这个:

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

我也search了这个问题,并在我的cordova应用程序内尝试,我只是想警告每个开发人员的Windows手机不覆盖

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

这是来自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'); }); 

如果你使用Grunt,你可以添加一个任务来删除/注释console.log语句。 因此console.log不再被调用。

https://www.npmjs.org/package/grunt-remove-logging-calls

警告:无耻的插头!

你也可以使用像我的JsTrace对象那样的模块化跟踪模块级别的“切换”function,只打开你想看到的时间。

http://jstrace.codeplex.com

(也有一个NuGet包,对于那些关心)

所有级别默认为“错误”,尽pipe您可以closures它们“closures”。 虽然,我想不出为什么你不想看到错误

你可以像这样改变它们:

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

阅读更多文档,查看文档

Ť

我在这个URL中find了一些更高级的代码JavaScript提示:Bust and Disable 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() {}; } 

你可以使用JavaScript AOP(例如jquery-aop )拦截所有对console.debug / log(around)的调用,如果某个全局variables设置为false,则不要继续进行实际的调用。

您甚至可以执行ajax调用(现在和之后),以便您可以在服务器上更改启用/禁用日志的行为,以便在临时环境或类似环境中遇到问题时启用debugging。

你可以使用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')来完全禁用每个日志消息。

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

特征:

  1. 它安全地覆盖了console.log。
  2. 注意,如果控制台不可用(哦,是的,你也需要考虑到这一点)。
  3. 存储所有日志(即使它们被禁止)以备以后检索。
  4. 处理主要的控制台function,如logwarnerrorinfo

是开放的修改,并会在新的build议出现时更新。

我写了这个:

 //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几乎可以是任何控制台function。 为你的情况将是:

 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并且默认情况下会禁用日志function,而且你可以启用它来调用console.log.setEnabled(true)

这应该覆盖window.console的所有方法。 您可以将它放在脚本部分的最上面,如果您使用的是PHP框架,则只能在应用程序环境为生产环境时打印此代码,或者禁用某种debugging标志。 然后,您可以将所有日志logging在开发环境或debugging模式下的代码中。

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

我一直在使用以下来处理他的问题:

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

将debugging设置为1以启用debugging。 然后在输出debugging文本时使用logging器function。 它也被设置为接受两个参数。

所以,而不是

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

使用

 logger("my","log"); 

我早些使用winston logger。

现在我正在使用经验更简单的代码:

  1. 设置环境variables(例如,在Windows上):

     setx LOG_LEVEL info 

当然,如果你喜欢,这可能是你的代码中的一个variables。

  1. 重新启动命令行,或者像Netbeans这样的IDE /编辑器

  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设置,上面的一些将会打印,其他的将不会打印