Javascript 如何使console.log可配置

Javascript 如何使console.log可配置,javascript,Javascript,在我的web应用程序(客户端重,服务器端轻)中,在开发过程中,我需要进行大量调试,console.log非常有用,但理想情况下在生产过程中,不能显示任何调试消息,因此我计划添加以下代码: window.production = false; // set to true when in production mode. if(window.production){ window.log = function(){}; }else{ window.log = funct

在我的web应用程序(客户端重,服务器端轻)中,在开发过程中,我需要进行大量调试,
console.log
非常有用,但理想情况下在生产过程中,不能显示任何调试消息,因此我计划添加以下代码:

window.production = false;  // set to true when in production mode.

if(window.production){    
    window.log = function(){};
}else{
    window.log = function(){
        console.log.apply(console, arguments);
    };
}    
//then replace all console.log(a, b, c, ...) into window.log(a, b, c, ...) in my code.

这是一种使调试可配置的好方法,还是我必须制作一个
grunt
,删除所有
console.log
生产行?

因此,如果您唯一的最终目标是不在生产中显示调试消息,那么您有大量的选项可供选择!您还应决定以下事项对您是否重要:

  • 能够在日志语句之外执行其他不应在生产中运行的工作
  • 最小化生产中的文件大小,而不发送日志代码
  • 多个日志级别,或不同的日志组
  • 能够在生产中打开/关闭这些日志记录级别或组
  • 最小化您必须为每个日志语句键入的数量
  • 在一个非常基本的层面上,只需调用

    if (window.console && window.console.log)
    {
        window.log = console.log.bind(console); // function devnull() { };
    }
    else
    {
        window.log = function() { };
    }
    
    log('This is a log!');
    
    将足以让您打开/关闭日志记录。这将实现上面列表中的目标(5),并且效果非常好

    另一种与uglify这样的小型化程序配合使用的解决方案可以删除死代码,它可以在日志语句周围使用以下内容(但是,您可能不想污染全局名称空间):

    这将满足条件(1)、(3)和(4),并使您以(5)为代价求解(2)

    与预定义的调试常量(或类似常量)相结合,在构建步骤中,您可以使用正则表达式替换日志语句:

    productionCode = debugCode.replace(/ShouldLog\(((?!LogLevels\.Error|LogLevels\.Warning)[^)]*)\)/g, 'DEBUG');
    
    这将完全删除代码中的无错误和无警告级别日志记录,并满足(2)。你真的不想让别人偷看你的日志吧。。加上更好的性能!:)

    奖金 如果您想获得额外的时髦感,可以使用以下方法(至少在Chrome中)为控制台中的每个日志记录语句获取堆栈跟踪。没有更多的“为什么这日志被击中”

    window.log = function ()
    {
        console.groupCollapsed.apply(console, arguments);
        var stack = new Error().stack.split('\n');
        for(var i = 2; i < stack.length; i ++)
        {
            // Trim and remove 'at ';
            console.log('%c' + stack[i].trim().substring(3), 'padding-left: 10px; color: #777');
        }
        console.groupEnd();
    };
    
    window.log=函数()
    {
    console.groupCollapsed.apply(控制台,参数);
    var stack=new Error().stack.split('\n');
    对于(变量i=2;i
    如果您使用的是诸如或之类的构建工具,那么有一些模块可以做到这一点:


    是的,够了。用log代替window.log也可以。看看这个答案,它对你有帮助吗?集中日志记录过程是一个好主意,如你在问题中提到的,可以轻松地打开/关闭它。你可以生成2个版本的js源代码1)带有日志和扩展代码2)基于cookie或任何url缩小/丑化,js可以加载。将缩小的和无日志的js设置为默认值。。并根据cookie/本地存储值加载未压缩文件。
    window.log = function ()
    {
        console.groupCollapsed.apply(console, arguments);
        var stack = new Error().stack.split('\n');
        for(var i = 2; i < stack.length; i ++)
        {
            // Trim and remove 'at ';
            console.log('%c' + stack[i].trim().substring(3), 'padding-left: 10px; color: #777');
        }
        console.groupEnd();
    };