最近發生了乙個特別詭異的問題, 無奈只能乙個乙個模組去去解讀,包管理是好,但遇到一些詭異的問題, 只能一行一行原始碼去讀, 索性是開源的, 如果非開源的。。。邊讀邊寫加深印象
作為乙個debug工具基本功能應該具備以下幾點
列印日誌(核心功能)
顯示 區分 不同的日誌
控制 輸出 不同的日誌
開啟關閉 日誌
我們帶著這些需求去看這個模組的原始碼,首先我們看下檔案結構
index.js (入口檔案)
debug.js (核心模組)
node.js (node 格式化輸出)
browser.js (browser 格式化輸出)
不管做什麼都是從開頭開始的, 首先看 index.js
if
(typeof process !==
'undefined'
&& process.type ===
'renderer'
)else
這段**很容易看出根據環境來判斷應該使用哪種型別的debug功能我對 browser 不是很了解, 就不去管這個了,直接看node.js
exports = module.exports =
require
('./debug');
exports.log = log;
exports.formatargs = formatargs;
很容易看出來 核心模組是debug, node.js是在該模組上新增或者修改了某一些功能接著我看下重頭戲 debug.js
exports = module.exports = debug.debug = debug;
function
debug
(namespace)
disabled.enabled =
false
;// define the `enabled` version
function
enabled()
enabled.enabled =
true
;var fn = exports.
enabled
(namespace)
? enabled : disabled;
fn.namespace = namespace;
// 返回對應處理函式
return fn;
}// 使用 require載入debug模組, debug 作為函式並呼叫 debug('socket.io:client') 賦值給debug
var debug =
require
('debug')(
'socket.io:client'
);
首先我們看之前的第乙個需求, 列印debug資訊
var logfn = enabled.log || exports.log || console.log.
bind
(console)
; logfn.
(self, args)
;
該段**說明列印功能的實現需求4 開啟關閉日誌如果需要擴充套件列印 enabled.log || exports.log 可對這兩個方法進行擴充套件, 並附帶優先順序
var fn = exports.
enabled
(namespace)
? enabled : disabled;
該處判斷了,對某類 debug 資訊 開啟還是關閉
由於這個功能我們需要使用, 就深入看一下 exports.enabled 原始碼
function
enabled
(name)
return
false;}
function
enable
(namespaces)
那什麼時候加入到 exports.names 中的呢? 看 node.js 這段**
exports.
enable
(load()
);function
load()
說明他讀取的 是 環境變數 debug 的值, 就是說, 我們對環境變數 debug 賦值 且正則 匹配正確以後 才會輸出資訊, 否則不會注意 debug賦值只是開啟,而正確的正則匹配才是真實的輸出日誌 這裡就實現了需求3
args = exports.formatargs.
(self, args)
;對列印的引數進行格式化
node.js
function
formatargs()
該段**就是控制 具體的顯示的顏色的好了, 模組分析到此結束。 囉嗦一句, 這個可以稍微改進一下, 對控制層進行再次封裝, 實現不重啟進行列印日誌
Mybatis中Logging模組的原始碼分析
週末又來到了公司吹吹空調,順便記錄下mybatis的點點滴滴。首先mybatis不定義日誌系統,完全依賴於第三方系統完成日誌記錄,利用介面卡模式完成實際操作,原始碼如下 1 定義乙個log介面,具有如下方法 public inte ce log2 然後引入第三方日誌,比如 loggingimpl,實...
Python bisect模組的使用與原始碼分析
本文基於python3.7分析 bisect提供了六個方法 不難發現,bisect 方法和bisect right 方法以及insort 方法和insort right 方法功能一致,在下面原始碼分析中會有解釋 import bisect l 1,2,4,4,5 n 4 idx1 bisect.bi...
AbstractCollection原始碼分析
abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...