2015-04-01 47 views
1

在我的web應用程序,而在發展,我需要做大量的調試,console.log是非常有幫助的,但最好是在生產,必須沒有顯示任何調試信息,所以我計劃添加下面的代碼:如何使(在服務器端對客戶端重,輕)的console.log配置

window.production = false; // set to true when in production mode. 

if(window.production){  
    window.log = function(){}; 
}else{ 
    window.log = function(){ 
     console.log.apply(console, arguments); 
    }; 
}  
//then replace all console.log(a, b, c, ...) into window.log(a, b, c, ...) in my code. 

這是一個很好的方式,使調試配置,或者我要進去做一個grunt,消除所有console.log線生產?

+0

是的,這就足夠了。而不是window.log只是日誌也很好。 – mohamedrias 2015-04-01 08:26:28

+0

看看這個答案,它對你有幫助嗎? http://stackoverflow.com/a/29350146/57095 – 2015-04-01 08:26:50

+0

這是一個好主意,集中記錄程序,輕鬆地打開/關閉你的問題中提到你。 – mshaaban 2015-04-01 08:31:37

回答

3

所以如果你唯一的最終目標是不在生產中顯示調試消息,你有大量的選項可供選擇!您還應該決定以下內容對您是否重要:

  1. 能夠在您的日誌語句之外執行其他工作,也不應該在生產中運行。
  2. 最大限度地減少生產中的文件大小並且不會傳送日誌代碼。
  3. 多個日誌級別或不同的日誌記錄組。
  4. 在生產中打開/關閉這些日誌級別或組的功能。
  5. 儘量減少每個日誌語句必須輸入的數量。

在一個非常基本的水平簡單地調用

if (window.console && window.console.log) 
{ 
    window.log = console.log.bind(console); // function devnull() { }; 
} 
else 
{ 
    window.log = function() { }; 
} 

log('This is a log!'); 

就足以讓你打開登錄/註銷。這將實現上面列表中的目標(5)並且工作得很好。

另一種解決方案,它與像醜化minifiers可去除死碼將圍繞你的日誌報表喜歡的東西(你可能不希望但污染全局命名空間)效果很好:

window.LogLevels = 
{ 
    Off:  0x00000000, 
    Error:  0x00000001, 
    Warning: 0x00000002, 
    Timing:  0x00000004, 
    Data:  0x00000008, 
    Status:  0x00000010, 
    ... 
    Verbose: 0x04000000, 
}; 

window.LogLevel = LogLevels.Error | LogLevels.Warning; 

window.ShouldLog = function(mask) 
{ 
    return ((window.LogLevel & mask) === mask); 
}; 

if (ShouldLog(LogLEvels.Error)) { log('This is an error!'); } 

這將滿足條件(1),(3)和(4),並且讓你以(5)的代價解決(2)。

加上一個預先定義的DEBUG常數(或類似),在構建步驟中,您可以替換正則表達式的日誌語句:

productionCode = debugCode.replace(/ShouldLog\(((?!LogLevels\.Error|LogLevels\.Warning)[^)]*)\)/g, 'DEBUG'); 

這將完全刪除非錯誤和非警戒水位登錄你的代碼並滿足(2)。你不是真的想讓人們在你的日誌裏偷看正確的..加上更好的表現! :)

獎金 如果你想獲得額外的時髦,你可以使用下面的(至少在鉻),以獲得在控制檯中的每個記錄語句的堆棧跟蹤。沒有更多的'爲什麼這個日誌受到打擊'!

window.log = function() 
{ 
    console.groupCollapsed.apply(console, arguments); 
    var stack = new Error().stack.split('\n'); 
    for(var i = 2; i < stack.length; i ++) 
    { 
     // Trim and remove 'at '; 
     console.log('%c' + stack[i].trim().substring(3), 'padding-left: 10px; color: #777'); 
    } 
    console.groupEnd(); 
}; 
相關問題