2010-07-26 22 views
9

我已經封裝了控制檯API以提供細粒度日誌記錄級別以及少數其他糖特徵。如何在包裝Firebug(或類似的)控制檯API時訪問行號碼

這工作正常,唯一的問題是,螢火蟲(或任何其他控制檯)將始終報告日誌的行號作爲控制檯API本身被調用的行。

你會如何建議我讓控制檯記錄我稱之爲包裝函數的行號?

我更喜歡跨瀏覽器的解決方案,但未能通過螢火蟲插件可能是一個好的開始。

FYI我打電話給我的登錄電子功能,像這樣:

db.log(db.LogLevel.WARN, "Blah Blah Blah"); 
+0

這將是更好,如果你能解釋一下你精心期待什麼。你想獲得你的函數的行號嗎? – 2010-12-02 14:09:52

回答

0

所以這個最近又上來,所以我決定重新審視它。

現在我年紀大了,明智一些,這對我來說是一個更好的解決方案,然後我試圖做的是調用控制檯功能,但在關閉關卡時選擇性地用虛擬函數替換它們。這給我細粒度的記錄和準確的線路報告。我以前的解決方案已經失去了一些功能,但我認爲這是一個可接受的折中方案。

這是我的新記錄11b的部分剪斷這說明主要解決

... 
levels : ["debug","info","warn","error"], 

    init : function(minLevel) { 
     var params = abm.getUrlParams(); 
     minLevel = params["debug"] || minLevel; 

     //TODO: firebug lite 
     window.console = window.console || {}; 

     var clear = false; 
     for (var i=0; i<self.levels.length; i++) { 
      var level = self.levels[i]; 
      originalFunctions[i] = originalFunctions[i] 
      || console[level] || fallback; 

      if (level && (clear || level===minLevel)) { 
       console[level] = originalFunctions[i]; 
       clear=true; 
      } else { 
       console[level] = suppressed(level); 
      } 
     } 

    } 
... 

你可以看到完整的東西在這裏:https://github.com/antiBaconMachine/abm-log

0

通常使用調試()或錯誤(),而不是日誌()函數會導致行號顯示。我相信Google Chrome控制檯的作用相似。 (firebug reference

+1

這不是顯示行號的問題,而是顯示右行號的問題。所有的日誌函數都顯示調用日誌函數的行號,在我的情況下,因爲我已經包裝了這個函數,它總是顯示相同的行號。 – 2010-11-09 11:58:17

+0

您開始離開javascript功能的範圍 - 請問您要做什麼?解決?調試? – 2010-11-09 18:39:52

3

有趣的問題...我可能會爲你破解。我現在無法測試這個,但我認爲它可能有效。

我們知道常規的函數調用將不起作用,所以我開始考慮C語言中的#defines以及各種其他語言中的宏。不幸的是,JavaScript沒有這個,但也許eval黑客將工作。我期待eval將運行代碼,就好像它來自同一行 - 如果沒有,bleh,忽略此答案的其餘部分。

我的方法是這樣的:

  1. 更改db.log功能指向eval(是的,EW)
  2. 而是在你的記錄等級作爲參數傳遞的,爲他們每個人的創造功能返回一個包含console.log的字符串和一條自定義消息。

它應該是這個樣子:

db = {LogLevel: {}}; 
db.log = eval; 
db.LogLevel.warn = function(message) { 
    return "console.log('THIS IS A WARNING: " + message + "');"; 
}; 

應該現在能夠這樣稱呼它:

db.log(db.LogLevel.warn("Blah blah blah")); 
+0

有趣的想法,開箱即用,精彩絕倫的思維。這是因爲大多數瀏覽器不會讓你別名eval作爲安全功能。在IE中它的工作原理與上述相同調用eval可能是一種解決方法,但我認爲這會開始削弱首先包裝控制檯的實用性。雖然很努力。 – 2010-12-14 09:22:39

+1

@奧利愛德華茲 - 我的錯,因爲沒有正確測試它!我在firefox和chrome中查了一下今天,雖然你是對的,但是有安全限制,看起來只有當你改變'eval'的**上下文**。因此,如果您不將'log'賦值給'db'對象(只是全局創建它),那麼您可以使用'eval'來替代它。 – 2010-12-15 01:15:29

1
//trust me, this way rocks! Auto prepend a logHead, yet keep correct line number displayed debug view. 
//Output sample: 
// 5/10 1:13:52.553 hi         a.js:100 
// 5/10 1:13:52.553 err         b.js:200 

    var Log = { 
     debug : true, 

     /* 
     * log.d(logData1, logData2, ...) 
     * --> console.log(getLogHead(), logData1, logData2, ...) 
     * 
     * @comment Using bind and property accesser 
     * @see http://ejohn.org/blog/javascript-getters-and-setters/ 
     */ 
     get d() { 
      if (!this.debug) return _emptyFunc; 
      return console.log.bind(console, this._getLogHeader()); 
     }, 

     /* 
     * output error info 
     */ 
     get e() { 
      return console.error.bind(console, this._getLogHeader()); 
     }, 

     /** 
     * get current time in 01/31 23:59:59.999 format 
     */ 
     _getLogHeader : function() { 

      var millisec = Date.now(); 
      this._dtNow.setTime(millisec); 
      //toLocaleString is 2013/01/31 23:59:59 
      return this._dtNow.toLocaleString().slice(5) + '.' + ('000' + millisec).slice(-3) + ' '; 
     }, 
     _dtNow: new Date(), 
     _emptyFunc: function() {} 
    }; 


    //enjoy it ! 
     Log.d('hi'); 
     Log.e('err'); 
+0

看起來很有趣我會玩一玩 – 2013-05-16 10:52:39

0

這裏有包日誌不失兩種方式上下文。第一個來自呼叫方的一點有點醜陋。第二個只有在你不需要記錄的細節時纔可用。

見的jsfiddle了演示:http://jsfiddle.net/epQ95/1/

// logger method 1: allows for fully functional log-wrapping without losing context, 
//     but, it is very ugly from the caller's perspective. 
var debug = function() { 
    // do my extra special stuff 
    window.console.log("logging to server 1: ", arguments); 

    // do regular console logging, if possible 
    if (window.console && window.console.log) { 
     return window.console.log.apply.bind(window.console.log, window.console, arguments); 
    } else { 
     return function() {}; 
    } 
}; 

// caller 
debug("logger method", 1)(); 

// logger method 2: pretty calling, but you don't know what was logged, 
//     just that something definitely was. 
var Logger = {}; 
Logger.__defineGetter__("debug", function() { 
    // do my extra special stuff 
    window.console.log("logging to server 2: don't know what was logged"); 

    // do regular console logging, if possible 
    if (window.console && window.console.log) { 
     return console.log.bind(window.console); 
    } else { 
     return function() {}; 
    } 
}); 

// caller 
Logger.debug("logger method", 2); 
相關問題