1.monolog模組分布結構:
formmater:內建的日誌顯示格式
handler:各種日誌處理類, 如寫檔案/發郵件/寫佇列
processor:內建的處理日誌類
logger.php:log處理的介面
2.logger.php的分析:
logger類的部分成員變數:
const debug = 100 等:常量,代表日誌級別
handlers:儲存日誌處理類以棧的形式
processers:
name: 通道的名字
補充:handlers中以棧(後進先出)的形式儲存著不同的handler。當一條record需要被記錄日誌時,它從棧頂開始向下遍歷整個棧直到找到被完全處理的handler。
processers中儲存的是向record中新增額外資訊的方法。
logger類的部分成員函式:
pushhandler(handlerinte***ce):向棧頂(陣列頭)壓入handler。引數型別是介面的形式,體現面向介面程式設計的特點,實現該介面的類都實現了介面規定的方法。
pophandler():從棧頂(陣列首)刪除handler。
pushprocessor(callback):壓入processor
popprocessor():刪除processor
adddebug/addinfo等:呼叫addrecord 以不同的日誌等級寫入日誌。
addrecord: 先判斷是否有handler,沒有的話加入最基礎的handler。遍歷handler棧找到能夠處理該等級的handler,遍歷processors,向record中新增額外的資訊。呼叫handler對record進行處理。
總結:logger類並不自己處理record,而是呼叫自己棧中的handler來處理記錄。它從棧頂到棧底遍歷,直到找到能夠處理該record的日誌的等級的handler。(相似於命令模式?存有command介面,呼叫命令時找到相應的命令實現進行執行。)
3.handler的分析:
3.1handler介面:
ishandling():判斷傳入的record日誌等級自己是否能夠處理
handle():處理record陣列,率過那些無法處理,返回的bool值決定logger是否繼續向下遍歷
handlebanch():立即處理record陣列
setfomatter():設定格式
3.2實現handler介面的抽象類,abstracthandler:
增加了成員變數:儲存日誌等級,格式,processor,是否冒泡
實現了部分介面 ishandling(), handlebanch(),setfomatter()
增加了對成員變數的操作:get,set
增加了close(),在物件銷毀時自動呼叫的函式
3.3繼承自abstracthandler的抽象類,abstractprocessinghandler:
實現了介面的 handle():呼叫write()
增加processrecord():為record增加額外資訊。
增加write抽象方法:寫日誌
3.4 最終的實現:streamhandler:
streamhandler根據傳入的路徑writer將日誌資訊寫入檔案。
還有firephphandler:實現的writer是傳送http頭。
還有其他的handler類,實現不同的功能 (多型?)
3.5bufferhandler:設定緩衝區,到一定數目再寫日誌,繼承自abstracthandler,可以包含其他handler進行功能擴充套件 (裝飾模式?)
總結:很多handler都繼承自同一抽象類卻實現不同的功能,write功能被抽出實現不同的功能(策略模式?),外部呼叫handler時只要呼叫介面。bufferhandler繼承自抽象類同時可以包含其他的handler類進行功能的擴充套件(實現了緩衝區),體現了(裝飾模式?)
4.fomatter介面:
fomatter模組和handler相似,具體實現都是繼承自介面,同時有不同的實現(策略模式)
openTLD 原始碼解讀
首先是run tld 在其次就是tldexample 最後到了初始化函式tldinit 第乙個比較關鍵的函式 bb scan 將影象網格化,將首先 scale 1.2.10 10 21 個規格 在每個規格上打網格 這個函式有乙個比較重要的方法 ntuples 就是重複 因為網格上的點很多點有相同的x...
thinkphp原始碼解讀
thinkphp原始碼解讀 thinkphp原始碼的根目錄下是 index.php,是系統預設的 主頁,index.php中首先檢測的是 php執行環境,如果php版本小於 5.3.0則退出執行,定義是否為除錯模式,定義應用目錄,引入入口檔案。thinkphp是整個框架的入口檔案,在thinkphp...
HashMap原始碼解讀
一 建立乙個hashmap都做了哪些工作?mapmap new hashmap hahmap無參構造方法 public hashmap 可以看到設定了載入因子 預設0.75 閾值 預設容量16 預設載入因子0.75 12 table是hashmap內部資料儲存結構entry陣列。當hashmap的s...