【Yii系列】錯誤處理和日誌系統

緣起

跟隨上一章的腳步,上一章中,咱們主要講解了在用戶發起請求,解析請求,服務器反饋請求以及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的空間供你使用,這是個巨坑。

還有一個就是日誌易啦,也是我目前在用的日誌分析工具,國內比較好的工具,你們能夠去到他的官網研究搞搞事情,挺不錯的。

好了,今天關於錯誤處理和日誌系統相關的就講到這兒^_^

相關文章
相關標籤/搜索