我对Javascript开发相当新,所以这可能是一个真正的新手问题。
我有一个sencha-touch应用程序充斥着console.log();
用于调试目的。
我已经chirpy完成了我的所有构建时间。它输出app.debug.js
用于调试以及app.min.js
用于生产
现在,我可以浏览所有寻找console.log();
的代码文件,并在我准备好投入生产时手动删除它,但我想知道是否有办法覆盖该方法。
基本上,每当调用console.log();
方法时,请不要这样做。
这样,我可以将覆盖代码文件放在我的生产配置中,而不是在我的调试配置中。
这可能吗?
答案 0 :(得分:196)
将它放在文件的顶部:
var console = {};
console.log = function(){};
对于某些浏览器和缩小器,您可能需要将其应用于窗口对象。
window.console = console;
答案 1 :(得分:43)
或者,如果您只想重新定义控制台的行为(例如,为了添加日志) 你可以这样做:
// define a new console
var console=(function(oldCons){
return {
log: function(text){
oldCons.log(text);
// Your code
},
info: function (text) {
oldCons.info(text);
// Your code
},
warn: function (text) {
oldCons.warn(text);
// Your code
},
error: function (text) {
oldCons.error(text);
// Your code
}
};
}(window.console));
//Then redefine the old console
window.console = console;
答案 2 :(得分:36)
能够在生产版本中切换日志记录非常有用。下面的代码默认关闭记录器。
当我需要查看日志时,我只需在控制台中输入debug(true)
。
var consoleHolder = console;
function debug(bool){
if(!bool){
consoleHolder = console;
console = {};
Object.keys(consoleHolder).forEach(function(key){
console[key] = function(){};
})
}else{
console = consoleHolder;
}
}
debug(false);
要彻底,这将覆盖所有控制台方法,而不仅仅是console.log
。
答案 3 :(得分:8)
console.log = function(){};
像其他任何东西一样覆盖它。
答案 4 :(得分:6)
我使用类似于posit labs的东西。将控制台保存在一个闭包中,并将其全部放在一个便携式功能中。
var GlobalDebug = (function () {
var savedConsole = console;
return function(debugOn,suppressAll){
var suppress = suppressAll || false;
if (debugOn === false) {
console = {};
console.log = function () { };
if(suppress) {
console.info = function () { };
console.warn = function () { };
console.error = function () { };
} else {
console.info = savedConsole.info;
console.warn = savedConsole.warn;
console.error = savedConsole.error;
}
} else {
console = savedConsole;
}
}
})();
只需执行globalDebug(false)即可关闭日志消息或使用globalDebug(false,true)删除所有控制台消息。
答案 5 :(得分:5)
我建议使用:https://github.com/sunnykgupta/jsLogger
功能强>
log
,warn
,error
,info
。可以修改,并会在出现新建议时更新。
免责声明:我是该插件的作者。
答案 6 :(得分:4)
如果不再需要,您还可以使用正则表达式删除代码中的所有console.log()调用。任何体面的IDE都允许您在整个项目中搜索和替换这些,并允许您在提交更改之前预览匹配项。
\s*console\.log\([^)]+\);
答案 7 :(得分:3)
请记住,使用此方法,每个console.log调用仍然会调用(空)函数导致开销,如果有100个console.log命令,则仍然会对空函数执行100次调用。
不确定这会导致多少开销,但会有一些,最好有一个标志来打开调试然后使用以下内容:
var debug=true; if (debug) console.log('blah')
答案 8 :(得分:3)
没有理由在prod环境中让所有的console.log遍布你的项目...如果你想以正确的方式做到这一点,请使用“drop_console”选项将UglifyJS2添加到您的部署过程中
答案 9 :(得分:2)
在阅读了很多帖子之后,我自己做了如下解决方案:
<强> SCRIPT:强>
function extendConsole() {
"use strict";
try {
var disabledConsoles = {};
console.enable = function (level, enabled) {
// Prevent errors in browsers without console[level]
if (window.console === 'undefined' || !window.console || window.console === null) {
window.console = {};
}
if (window.console[level] === 'undefined' || !window.console[level] || window.console[level] == null) {
window.console[level] = function() {};
}
if (enabled) {
if (disabledConsoles[level]) {
window.console[level] = disabledConsoles[level];
}
console.info("console." + level + "() was enabled.");
} else {
disabledConsoles[level] = window.console[level];
window.console[level] = function () { };
console.info("console." + level + "() was disabled.");
}
};
} catch (exception) {
console.error("extendConsole() threw an exception.");
console.debug(exception);
}
}
<强> USAGE:强>
extendConsole();
console.enable("debug", window.debugMode);
示例:强>
答案 10 :(得分:2)
当url不包含localhost时,这将覆盖console.log函数。您可以使用自己的开发设置替换localhost。
// overriding console.log in production
if(window.location.host.indexOf('localhost:9000') < 0) {
console.log = function(){};
}
答案 11 :(得分:1)
您可以查看UglifyJS
:http://jstarrdewar.com/blog/2013/02/28/use-uglify-to-automatically-strip-debug-messages-from-your-javascript/,https://github.com/mishoo/UglifyJS
我还没有尝试过。
引用,
if (typeof DEBUG === 'undefined') DEBUG = true; // will be removed
function doSomethingCool() {
DEBUG && console.log("something cool just happened"); // will be removed }
... Uglify的死代码删除程序将删除日志消息行 (因为它将删除任何总是评估的条件 假)。那将是第一个有条件的。但是当你测试的时候 未压缩的代码,DEBUG将首先启动undefined 条件将它设置为true,以及所有console.log()消息 会工作的。
答案 12 :(得分:1)
这就是我做的事情
var domainNames =["fiddle.jshell.net"]; // we replace this by our production domain.
var logger = {
force:false,
original:null,
log:function(obj)
{
var hostName = window.location.hostname;
if(domainNames.indexOf(hostName) > -1)
{
if(window.myLogger.force === true)
{
window.myLogger.original.apply(this,arguments);
}
}else {
window.myLogger.original.apply(this,arguments);
}
},
forceLogging:function(force){
window.myLogger.force = force;
},
original:function(){
return window.myLogger.original;
},
init:function(){
window.myLogger.original = console.log;
console.log = window.myLogger.log;
}
}
window.myLogger = logger;
console.log("this should print like normal");
window.myLogger.init();
console.log("this should not print");
window.myLogger.forceLogging(true);
console.log("this should print now");
此处也发布了相关信息。 http://bhavinsurela.com/naive-way-of-overriding-console-log/