2011-07-22 232 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

回答

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')在你的代碼。

相關問題