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的调用.
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)
ist*_*iuk 15
覆盖内置函数不是一个好习惯.也无法保证您将抑制所有输出,您使用的其他库可能会还原您的更改,还有其他可能写入控制台的函数; .dir(),.warning(),.error(),.debug(),.assert()等.
正如一些人所建议的那样,您可以DEBUG_MODE有条件地定义变量和日志.根据代码的复杂性和性质,编写自己的记录器对象/函数可能是一个好主意,该对象/函数包含控制台对象并具有内置的此功能.那将是处理仪器的合适场所.
也就是说,出于"测试"目的,您可以编写测试而不是打印到控制台.如果您没有进行任何测试,并且这些console.log()行只是帮助您编写代码,只需删除它们即可.
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)
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 () {
var debug = false
if (debug === false) {
if ( typeof(window.console) === 'undefined') { window.console = {}; }
window.console.log = function () {};
}
})()
Run Code Online (Sandbox Code Playgroud)
如果您使用的是IE7,则不会定义控制台.所以更友好的IE版本将是:
if (typeof console == "undefined" || typeof console.log == "undefined")
{
var console = { log: function() {} };
}
Run Code Online (Sandbox Code Playgroud)
在我搜索了这个问题以及在我的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)
如果您使用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排除所有控制台调用。
这是我刚刚研究的一个相当详尽的解决方案。我从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.照常使用。
这是来自SolutionYogi和Chris 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)
| 归档时间: |
|
| 查看次数: |
183041 次 |
| 最近记录: |