monolog原始碼解讀

2021-07-15 21:38:45 字數 2002 閱讀 2676

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...