Yii2 Log初探


關於Yii2的log組件我想理清如下幾個問題:

(1)我們在配置文件(common\config\main.php或app\config\main.php)中定義的log組件配置如何發揮作用,怎樣記錄到文件,怎樣發送到郵箱;

(2)我們把log組件添加到配置文件的bootstrap[]中有什么作用;

(3)我們通過Yii::error(),Yii::info(),Yii::trace()等方法記日志時與log組件發生了怎樣的關聯。

1.Yii2 Log相關類結構

 

(1)BaseYii

    1)類中定義了一個私有成員變量$_logger,類型為yii\log\Logger,並提供了對應的屬性讀寫方法;

    2)定義了我們經常用到的Yii::trace()等記錄不同等級log的快捷方法,省去通過Yii::getLogger()獲取logger,再手動設置log級別的過程;

(2)yii\log\Logger

    1)這里有幾個關鍵屬性需要理解:一個是存儲log信息的$messages數組,一個是flush掉$messages的數量閾值$flushIntervalInteger,還有一個用於分發$messages到不同存儲目標的$dispatcher,而這個分發者的類型是yii\log\Dispatcher;

    2)log()是被Yii::error()等便捷方法直接調用的方法,功能是將不同級別的日志消息整理並記錄到$messages中,包含每條消息的內容,級別,所屬category等;

    3)flush()方法會使用$dispatcher的diapatch()方法將$messages消息分發出去,執行分發的一個前提條件是消息數量達到閾值$flushIntervalInteger。

(3)yii\base\Application

    1)coreComponents()方法定義了應用的核心組件,其中包括log組件,關聯的類正是yii\log\Dispatcher;

    2)$bootstrap中存放我們在配置文件中指定的bootstrap內容,這里的內容會在Application的構造方法里被實例化,所以我們把核心組件log額外加到$bootstrap中是為了在應用實例化時就拿到實例化的log組件以便后續應用;

    3)構造方法中會通過基類的構造方法調用init(),而init()方法會調用bootstrap()方法,在bootstrap()里對$bootstrap的內容進行了實例化。

(4)yii\log\Dispatcher

    1)$targets接收我們在配置文件中為log組件指定的日志目標信息,日志目標均是yii\log\Target的子類,各自按照各自的方式處理指定levels與指定categories的日志消息;

    2)$_logger屬性實際存儲的是BaseYii::getLogger()的內容,在yii\log\Dispatcher::__constract()中做了一個關聯處理,即將Dispatcher對象自身賦值給了BaseYii中$_logger的$dispatcher屬性,此時BaseYii的$_logger與Application的log組件才算真正發生了關聯;

    3)dispatch()方法將yii\log\Logger::flush()傳送過來的$messages進行分發,具體方式是調用$targets中所有Target的collect()方法,將消息的處理下放到Target層。

(5)yii\log\Target

    1)這里的幾個關鍵屬性與我們在配置文件中對log組件的配置方式直接相關,例如我們可以指定某種日志目標有權處理的日志級別($_levels),日志所屬category($categories),以及日志內容需要追加的變量信息($logVars)等;

    2)collect()方法被yii\log\Dispatcher直接調用,對分發過來的日志消息進行過濾整理,找出符合指定日志級別與categories的部分,然后調用交由子類具體實現的export()方法將日志內容導出到具體目標,如EmailTarget會使用配置的$mailer發送到指定郵箱,FileTarget會存儲到指定目錄的日志文件等。

2.Yii2 Log組件初始化與一次error日志記錄過程

 

結合上圖與第一部分的解釋可以更加清晰地理解如下問題:

(1)log組件是在應用實例化的時候被實例化的;

(2)BaseYii的$_logger是在log組件實例化的時候就與log組件產生關聯的,所以我們在使用Yii::error()等方法時會使用我們配置的log組件(實際是一個日志分發器)實現日志的分發處理;

(2)我們對log組件的主要配置其實作用在其$targets屬性,也就是具體的日志目標的屬性配置,這些具體的Target才是真正處理日志去向的地方。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM