2013-04-10 543 views
4

我目前正在使用Javascript构建一个库,并且非常喜欢Google的DevTools进行调试。不幸的是,我不希望我的图书馆在我发布时登录。DevTools控制台 - 关闭它

这是我的记录器当前如何设置。

var debug = false; 

var increaseSomething = function() 
{ 
    // Random Code... 

    if (debug) { console.log("Increased!"); } 
} 

不幸的是,这很烦人,我不应该在每次调用登录控制台之前检查debug是否打开。

我可以尝试将控制台封装在自己的日志记录对象中,但我觉得这不是一个好主意。有什么想法吗?

+0

我会再次发布,你看看[这个](http://benalman.com/projects/javascript-debug-console-log/)? – adeneo 2013-04-10 00:21:21

+0

@adeneo我没有看过,因为它的跨浏览器兼容,但不包括一些chromes控制台功能。如果我必须我可以延长这一点。 – 2013-04-10 00:24:04

+0

首先,使用调试而不是控制台有点令人困惑,但它很方便,并且有一种简单的方法来禁用所有日志记录 - >'debug.setLevel(0)'和许多其他简洁的功能。只要覆盖log()函数对我来说听起来不是一个好主意! – adeneo 2013-04-10 00:26:36

回答

0

我想到了再次封装控制台记录器和代替未来与整个对象封装我创建了一个函数,它在一个控制台控制台方法。然后它检查调试是否打开并调用该函数。

var debug = true; 

var log = function (logFunction) { 
    if (debug) { 
     logFunction.apply(console, Array.prototype.slice.call(arguments, 1)); 
    } 
}; 

var check = function (canvas) { 
    log(console.groupCollapsed, "Initializing WebGL for Canvas: %O", canvas); 
    log(console.log, "cool"); 

    log(console.groupEnd); 
}; 

check(document.getElementById('thing')); 

我喜欢@ Esthete的想法,但我不想做封装的控制台。 这里是jsfiddle作为例子:http://jsfiddle.net/WRe29/

在这里,我添加一个debugCall对象原型。相同的日志功能只是一个不同的名称,所以他们没有'重叠'现在任何对象都可以调用debugCall并检查其debug标志。

Object.prototype.debugCall = function(logFunction) 
{ 
    if (this.debug) { logFunction.apply(console, Array.prototype.slice.call(arguments, 1)); } 
}; 

var Thing = { debug : true /*, other properties*/ }; 
Thing.debugCall(console.log, "hello world"); 

编辑:

我最初的想法是使用一个对象作为“配置”以指示对象是否应该被记录。我已经用了一段时间并喜欢配置概念,但并不认为每个人都会如此热衷于在代码中使用配置对象,同时将函数传递给对象的扩展函数。因此,我采用了这个概念,而不是看功能装饰。

Function.prototype.if = function (exp) { 
    var exFn = this; 
    return function() { 
     if (exp) exFn.apply(this, arguments); 
    }; 
}; 

var debug = false; 

console.log = console.log.if(debug); 
console.group = console.group.if(debug); 
// Console functions... 
myFunction = myFunction.if(debug); 

这很简单,几乎不需要甚至有一个检查表达一个装饰作用,但我不愿意把无处不在的if语句在我的代码。希望这可以帮助某个人甚至引发他们对功能装饰的兴趣。

注意:这样同时也会杀灭记录给大家,除非你安装的扩展是否正确;)*咳嗽某种类型的对象/库配置指示调试

5

你可以这样做吗?

if (!debug) { 
    console.log = function() {/* No-op */} 
} 

正如你所说,你可能不想杀死所有日志的每一个人。这是我通常如何去做的。在一些实用程序文件中将它们定义为全局函数。我通常为LOG,WARN,ERRORTRACE添加附加功能,并根据详细级别记录这些功能。

// Define some verbosity levels, and the current setting. 
_verbosityLevels = ["TRACE", "LOG", "WARN", "ERROR"]; 
_verbosityCurrent = _verbosityLevels.indexOf("LOG"); 

// Helper function. 
var checkVerbosity = function(level) { 
    return _verbosityLevels.indexOf(level) <= _verbosityCurrent; 
} 

// Internal log function. 
var _log = function(msg, level) { 
    if(!debug && checkVerbosity(level)) console.log(msg); 
} 

// Default no-op logging functions. 
LOG = function() {/* no-op */} 
WARN = function() {/* no-op */} 

// Override if console exists. 
if (console && console.log) { 
    LOG = function(msg) { 
    _log(msg, "LOG"); 
    } 
    WARN = function(msg) { 
    _log(msg, "WARN"); 
    } 
}  

这还允许您向日志中添加重要信息,例如时间和来电者位置。

console.log(time + ", " + arguments.callee.caller.name + "(), " + msg); 

这可输出是这样的:

"10:24:10.123, Foo(), An error occurred in the function Foo()" 
+0

然后只是将控制台方法的每个部分分配给空函数?整洁的想法。 – 2013-04-10 00:15:15

+0

@Nate - 像平时一样调用'console.log()',但是如果这一行被提前处理,日志将不会执行任何操作。 – Aesthete 2013-04-10 00:17:16

+0

除了控制台之外,有更多的方法不仅仅是日志。另外,我不确定是否我想在其他人使用我的库时杀死控制台... – 2013-04-10 00:19:10