跟隨上一章的腳步,上一章中,咱們主要講解了在用戶發起請求,解析請求,服務器反饋請求以及session的一些知識點,這過程當中,不免會遇到一些問題,比方說數據庫查詢失敗,用戶輸入致使腳本出錯,網絡問題等等突發狀況,對於突發狀況,作過軟件的通常都知道,會有錯誤處理和日誌去記錄下這個過程,一樣的,Yii也提供了相似的功能幫助咱們去抓住錯誤,記錄錯誤,而且對相應錯誤作出對應處理。程序員
Yii 內置了一個error handler錯誤處理器。web
全部非致命PHP錯誤(如,警告,提示)會轉換成可獲取異常。算法
拋出異常數據庫
use yii\web\NotFoundHttpException; throw new NotFoundHttpException();
對於可能產生異常的地方,咱們要使用try...catch...bootstrap
use Yii; use yii\base\ErrorException; try { 10/0; } catch (ErrorException $e) { Yii::warning("Division by zero."); }
error handler 錯誤處理器默認啓用。數組
return [ 'components' => [ 'errorHandler' => [ 'errorAction' => 'site/error', ], ] ];
通常的保留原先應用主體中的配置便可,若是想要定製化錯誤的格式輸出,能夠去官網好好研究研究呢,這裏不細究,錯誤產生,打印出來便可,至於如何記錄下來,方便咱們查找,這纔是重要的。服務器
提起日誌系統,大夥可能第一個想到的就是在適當的位置插入一行代碼,而後執行到這行代碼以後就會被記錄一些東西到一個文件中。網絡
是的,這就是最原始的日誌系統,以前搞的Python自動發郵件的那個日誌記錄系統就是這麼簡單的一個玩意兒,可是收到的成效會很是好。就和程序員寫註釋同樣,在對的位置加上log,這會大大下降你係統的維護成本。session
Yii提供了一個強大的日誌框架,這個框架具備高度的可定製性和可擴展性。app
調用起來也至關簡單
Yii::trace():記錄一條消息去跟蹤一段代碼是怎樣運行的。這主要在開發的時候使用。 Yii::info():記錄一條消息來傳達一些有用的信息。 Yii::warning():記錄一個警告消息用來指示一些已經發生的意外。 Yii::error():記錄一個致命的錯誤,這個錯誤應該儘快被檢查。
上面的這幾個日誌類型是根據嚴重程度來記錄的
exception須要記錄到warning和error裏面
重要的日誌信息會單獨記錄到單獨的key中,方便查找,就是這些個方法的第二個參數:category,這個參數是能夠自定義的。這和你的配置有關,以下是一個比較標準的配置log的方式。
return [ // the "log" component must be loaded during bootstrapping time 'bootstrap' => ['log'], 'components' => [ 'log' => [ 'targets' => [ [ 'class' => 'yii\log\DbTarget', 'levels' => ['error', 'warning'], ], [ 'class' => 'yii\log\EmailTarget', 'levels' => ['error'], 'categories' => ['yii\db\*'], 'message' => [ 'from' => ['log@example.com'], 'to' => ['admin@example.com', 'developer@example.com'], 'subject' => 'Database errors at example.com', ], ], ], ], ], ];
log
組件必須在 bootstrapping 期間就被加載,以便於它可以及時調度日誌消息到目標裏。
上面的error和warning會被以存儲到數據表的形式存儲,我通常都會存儲在runtime的log下面,以文件的方式去存儲,過一週時間備份下這些log,而後從服務器刪除掉這些log。
第二個是error的時候要給admin和developer兩個example.com郵箱發送郵件。
Yii配備瞭如下的內建日誌目標。
yii\log\DbTarget:在數據庫表裏存儲日誌消息。 yii\log\EmailTarget:發送日誌消息到預先指定的郵箱地址。 yii\log\FileTarget:保存日誌消息到文件中. yii\log\SyslogTarget:經過調用PHP函數 syslog() 將日誌消息保存到系統日誌裏。
我通常使用的就是那個FileTarget,配置以下:
'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], [ 'class' => 'yii\log\FileTarget', 'categories' => ['tongzi.info.*', 'yii\db\*'], 'levels' => ['info'], 'logVars' => [], ] ], ]
上面的應用配置設置了 yii\log\Dispatcher::traceLevel 的層級,假如 YII_DEBUG
開啓則是3,不然是0。
這意味着,假如 YII_DEBUG
開啓,每一個日誌消息在日誌消息被記錄的時候, 將被追加最多3個調用堆棧層級;假如 YII_DEBUG
關閉, 那麼將沒有調用堆棧信息被包含。
categories 屬性是一個包含消息分類名稱或者模式的數組。
一個分類模式是一個以星號 *
結尾的分類名前綴。假如一個分類名與分類模式具備相同的前綴, 那麼該分類名將和分類模式相匹配。
若是你使用了yii\log\FileTarget類的日誌目標,你的消息格式應該是下面的~
2014-10-04 18:10:15 [::1][][-][trace][yii\base\Module::getModule] Loading module: debug
默認狀況下,日誌消息將被格式化,格式化的方式遵循 yii\log\Target::formatMessage():
Timestamp [IP address][User ID][Session ID][Severity Level][Category] Message Text
也能夠自定義日誌格式,不過徹底沒有必要那麼搞,這麼多的信息足夠查錯啦。
另外,定義好各個category後,你就可使用各類工具查看log啦。
這邊推薦你們使用兩個日誌分析工具,splunk和日誌易,splunk,我有個同窗在裏面,作大數據分析算法,反正我以爲挺牛,Splunk在全球大數據分析數一數二。並且界面也很友好,只是免費版的只有500M的空間供你使用,這是個巨坑。
還有一個就是日誌易啦,也是我目前在用的日誌分析工具,國內比較好的工具,你們能夠去到他的官網研究搞搞事情,挺不錯的。
好了,今天關於錯誤處理和日誌系統相關的就講到這兒^_^