雜物聚集地

停用console

Tue, 21 Dec 2021 10:19:37 GMT

目前公司專案有一個需求是將console.log/info/warn/error等除錯log隱藏起來不讓別人看到,因此一開始採用了以下方法

console.log = function () {};

這樣可以簡單地將log方法替換為一個空方法,自然呼叫console.log就不會有任何log輸出。

過一陣子後發現有一些工具是以類似的方法來做log紀錄,於是不想被看到的log可能會被以相同的方法接走,於是換了一個做法來處理。

一開始的想法是只要將最後產出js中的console.log/info/warn/error等等方法的參數改成空的就行了,但實際做起來有點難度,因為要考慮字串格式,還要考慮字串換行的狀況,實在是有點麻煩。
但後來反著想只要將console方法換成其他的方法就行了,於是使用regex找出相關文字替換。

// 程式碼替換
code.replace(/((window\.)?console.)(log|debug|info|warn|error)\(/g, "$1silent(")
// 最前面增加空方法
console.silent=function(){};window.console.silent=console.silent;

這樣應該就會讓所有的console方法替換成silent這個空方法。

正常運行了一陣子後,某天有issue回報有一些瀏覽器如360瀏覽器會說找不到console.silent這個方法,經過測試後發現,該瀏覽器會在某個時間點(猜測是在body onload之後)把console這個物件直接替換掉,導致已經加到console的silent方法消失,於是改成document.silent來解決。