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私は通常、 、WARNERRORおよびに関数を追加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()"
于 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 プロトタイプに を追加します。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 拡張機能を正しくセットアップしない限り、全員のロギングも強制終了されます ;) *デバッグを示すある種のオブジェクト/ライブラリ構成を咳払いします

于 2013-04-10T00:52:31.013 に答える
0

https://github.com/pimterry/loglevel

ログ レベル ライブラリ::これが必要かどうか試してください。

于 2015-08-20T19:28:33.240 に答える