覆盖console.log(); 用于生产

Cha*_*ell 110 javascript debugging

我是Javascript开发的新手,所以这可能是一个真正的新手问题.

我有一个用于调试目的的应用程序console.log();.

我有做了我所有的编译时间相结合.它输出一个app.debug.js用于调试以及app.min.js用于生产

现在我可以查看所有代码文件,console.log();并在我准备好进行生产时手动删除它,但我想知道是否有办法覆盖该方法.

基本上,每当console.log();调用该方法时,请不要这样做.

这样,我可以将覆盖代码文件放在我的生产配置中,而不是在我的调试配置中.

这可能吗?

Nea*_*eal 212

把它放在文件的顶部:

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

对于某些浏览器和缩小器,您可能需要将其应用于窗口对象.

window.console = console;
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记覆盖`console.info`,`console.warn`和`console.error`,如果你使用那些 (77认同)
  • FWIW,在控制台的原型上还有许多其他功能,尽管其中许多功能很少使用.从Chrome 38开始:`assert`,`clear`,`constructor`,`count`,`debug`,`dir`,`dirxml`,`error`,`group`,`groupCollapsed`,`groupEnd`,` info`,`log`,`markTimeline`,`profile`,`profileEnd`,`table`,`time`,`timeEnd`,`timeStamp`,`timeline`,`timelineEnd`,`trace`,`warn` . (10认同)
  • 虽然这是一个高度投票的答案,我不推荐它,它会覆盖整个控制台对象,而不是仅覆盖日志功能. (7认同)
  • ```var console = 控制台 || {};console.log = 函数(){}; ``` 是一种更好的方法,只覆盖日志 (3认同)

Lud*_*ltz 50

或者,如果您只想重新定义控制台的行为(例如,为了添加日志),您可以执行以下操作:

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

  • 非常好......因为这些控制台方法接受多个参数,代价是有点额外的复杂性,我们可以通过调用`oldCons.log.apply(arguments)来支持它. (9认同)
  • `console` 对象上还有很多方法。请注意,如果您这样做,而某人的代码尝试使用任何其他方法,您将收到大量“未定义不是函数”错误!https://developer.mozilla.org/en-US/docs/Web/API/Console_API (5认同)
  • @python1981,或者我们可以使用 ES6 扩展运算符。 (2认同)

pos*_*abs 39

能够在生产构建中切换日志记录是非常有用的.下面的代码默认关闭记录器.

当我需要查看日志时,我只需输入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);
Run Code Online (Sandbox Code Playgroud)

要彻底,这将覆盖所有控制台方法,而不仅仅是console.log.

  • 它工作正常,但删除行 consoleHolder = console; 当第 1 行 bool = false 时 4. 因为此行在连续调用debug(false)两次时禁用此功能。如果我们已经调用了 debug(false);debug(false); ,我们就不能再次调用 debug(true); 意思是两次 (2认同)

Zir*_*rak 8

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

像其他任何东西一样覆盖它.

  • -1.不要这样做!这里的行将抛出一个`ReferenceError`并在`console`对象不存在的浏览器上保留`console.log` undefined,这对于至少某些版本的IE来说是一个问题.如果你的目标是让你的网络应用程序准备就绪,比如OP,那么这几乎不是你需要的解决方案.做Neal所写的. (16认同)
  • @MarkAmery你是对的.我采用"覆盖"的字面意思,如"替换",所以我当然假设原始存在. (3认同)

Rya*_*yan 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;
        }
    }
})();
Run Code Online (Sandbox Code Playgroud)

只需执行globalDebug(false)即可关闭日志消息或使用globalDebug(false,true)删除所有控制台消息.


Pap*_*ppa 5

如果不再需要,您还可以使用正则表达式删除代码中的所有 console.log() 调用。任何像样的 IDE 都将允许您在整个项目中搜索和替换这些内容,并允许您在提交更改之前预览匹配项。

\s*console\.log\([^)]+\);
Run Code Online (Sandbox Code Playgroud)


Sun*_*pta 5

我建议使用:https://github.com/sunnykgupta/jsLogger

特征:

  1. 它安全地覆盖了console.log.
  2. 如果控制台不可用,请小心(哦,是的,你也需要考虑它.)
  3. 存储所有日志(即使它们被抑制)以供以后检索.
  4. 处理重大控制台功能,如log,warn,error,info.

可以修改,每当有新的建议时都会更新.

免责声明:我是该插件的作者.