4

我目前正在用 Javascript 构建一个库,并且非常喜欢 Google 的 DevTools 来调试它。不幸的是,我不希望我的库在我发布时记录。

这就是我的记录器当前的设置方式。

var debug = false;

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

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

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

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

4

3 回答 3

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()"
于 2013-04-10T00:12:34.473 回答
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'));

我确实喜欢@Aesthete 的想法,但我还不想制作封装的控制台。这里是以 jsfiddle 为例:http: //jsfiddle.net/WRe29/

debugCall在这里,我向 Objects 原型添加了一个。与日志函数相同,只是名称不同,因此它们没有“重叠” 现在任何对象都可以调用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 扩展,否则这种方式也会终止所有人的日志记录;)*咳嗽某种类型的对象/库配置,指示调试

于 2013-04-10T00:52:31.013 回答
0

https://github.com/pimterry/loglevel

日志级别库::试试这是否适合你的需要。

于 2015-08-20T19:28:33.240 回答