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

时间:2011-08-12 15:40:07

标签: javascript debugging

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

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

我已经完成了我的所有构建时间。它输出app.debug.js用于调试以及app.min.js用于生产

现在,我可以浏览所有寻找console.log();的代码文件,并在我准备好投入生产时手动删除它,但我想知道是否有办法覆盖该方法。

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

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

这可能吗?

13 个答案:

答案 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

功能

  1. 它安全地覆盖了console.log。
  2. 如果控制台不可用,请注意(哦,是的,你也需要考虑因素。)
  3. 存储所有日志(即使它们被禁止)以供日后检索。
  4. 处理主要的控制台功能,例如logwarnerrorinfo
  5. 可以修改,并会在出现新建议时更新。

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

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

示例:

http://jsfiddle.net/rodolphobrock/2rzxb5bo/10/

答案 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)

您可以查看UglifyJShttp://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/