2011-07-22 16 views
9

私はこのような機能を作りたいと思います。例えばjavascript抽象コンソールログ

function Logger() { 
    this.log = function(msg) { 
     console.log(msg); 
    } 
} 

そして、私は機能/モジュールなどでそれを使用したい、とすべてが正常に動作しています。 しかし、私のブラウザのデフォルトのコンソールは通常、fileName + lineNumberを与えます。

この機能を抽象化すると、fileNamelineNumberはinstance.log()を配置する場所ではありません。なぜなら、console.logがどこから呼び出されているのか、関数自体ではないからです。

だから私の質問:

は、どのように私は私のロガーを使用する場所から正しい情報を得ることができますか? この機能を改善するためのヒントを教えてください。

+0

どのロギングアプリケーションを使用して、行番号とファイル名を入れますか? – ar3

+0

Chrome、Safariなどで使用可能なデフォルトのインスペクタ – Barry

答えて

16
function Logger() { 
    this.log = console.log.bind(console); 
} 

これまでのところ、私はこのことについて尋ねました:Create shortcut to console.log() in Chrome

+0

素晴らしい!ありがとうございました! – Barry

+0

Safari 5.0でエラーが発生します。世話をする。 – linjunhalida

0

はこのようにバックトレース機能を使用してみてください:

function printStackTrace() { 
    var callstack = []; 
    var isCallstackPopulated = false; 
    try { 
     i.dont.exist += 0; //doesn't exist- that's the point 
    } catch (e) { 
     if (e.stack) { //Firefox 
      var lines = e.stack.split('\n'); 
      for (var i = 0, len = lines.length; i & lt; len; i++) { 
       if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) { 
        callstack.push(lines[i]); 
       } 
      } 
      //Remove call to printStackTrace() 
      callstack.shift(); 
      isCallstackPopulated = true; 
     } 
     else if (window.opera & amp; & amp; e.message) { //Opera 
      var lines = e.message.split('\n'); 
      for (var i = 0, len = lines.length; i & lt; len; i++) { 
       if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) { 
        var entry = lines[i]; 
        //Append next line also since it has the file info 
        if (lines[i + 1]) { 
         entry += ' at ' + lines[i + 1]; 
         i++; 
        } 
        callstack.push(entry); 
       } 
      } 
      //Remove call to printStackTrace() 
      callstack.shift(); 
      isCallstackPopulated = true; 
     } 
    } 
    if (!isCallstackPopulated) { //IE and Safari 
     var currentFunction = arguments.callee.caller; 
     while (currentFunction) { 
      var fn = currentFunction.toString(); 
      var fname = fn.substring(fn.indexOf(& amp; quot; 

      function & amp; quot;) + 8, fn.indexOf('')) || 'anonymous'; 
      callstack.push(fname); 
      currentFunction = currentFunction.caller; 
     } 
    } 
    output(callstack); 
} 

function output(arr) { 
    //Optput however you want 
    alert(arr.join('\n\n')); 
} 
+0

ありがとうございました。より具体的にお聞かせください。正確に何を、いつ、どのように使用するのですか? – Barry

0

機能を割り当ててみます

(function() { 
    window.log = (console && console.log 
     ? console.log 
     : function() { 
       // Alternative log 
      }); 
})(); 

その後、ちょうどあなたのコード内でlog('Message')を呼び出します。