我目前正在使用Javascript构建一个库,并且非常喜欢Google的DevTools来进行调试。不幸的是,当我发布时,我不希望我的库记录。
这是我的记录器当前设置的方式。
var debug = false;
var increaseSomething = function()
{
// Random Code...
if (debug) { console.log("Increased!"); }
}
不幸的是,这非常烦人,我不应该在每次调用登录到控制台之前检查调试是否已打开。
我可以尝试将控制台封装在我自己的日志记录对象中,但我觉得这不是一个好主意。有什么想法吗?
答案 0 :(得分:5)
你可以这样做吗?
if (!debug) {
console.log = function() {/* No-op */}
}
正如您所提到的,您可能不希望为所有人终止所有日志记录。这就是我经常这样做的方式。在一些实用程序文件中定义这些作为全局函数。我通常会为LOG
,WARN
,ERROR
和TRACE
添加其他功能,并根据详细级别记录这些功能。
// 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()"
答案 1 :(得分: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/
在这里,我向Objects原型添加debugCall
。与log函数相同,只是一个不同的名称,因此它们没有'重叠'现在任何对象都可以调用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语句。希望这可以帮助某些人甚至激发他们对功能装饰的兴趣。
注意:除非你正确设置if扩展名,否则这种方法也会杀死所有人的日志记录;)*咳嗽某种类型的对象/库配置指示调试
答案 2 :(得分:0)
https://github.com/pimterry/loglevel
日志级别库::尝试这是否适合您的需要。