所以如果你唯一的最終目標是不在生產中顯示調試消息,你有大量的選項可供選擇!您還應該決定以下內容對您是否重要:
- 能夠在您的日誌語句之外執行其他工作,也不應該在生產中運行。
- 最大限度地減少生產中的文件大小並且不會傳送日誌代碼。
- 多個日誌級別或不同的日誌記錄組。
- 在生產中打開/關閉這些日誌級別或組的功能。
- 儘量減少每個日誌語句必須輸入的數量。
在一個非常基本的水平簡單地調用
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();
};
是的,這就足夠了。而不是window.log只是日誌也很好。 – mohamedrias 2015-04-01 08:26:28
看看這個答案,它對你有幫助嗎? http://stackoverflow.com/a/29350146/57095 – 2015-04-01 08:26:50
這是一個好主意,集中記錄程序,輕鬆地打開/關閉你的問題中提到你。 – mshaaban 2015-04-01 08:31:37