yii2 日記處理

一、實戰

1.1、配置

'log' => [
    'traceLevel' => YII_DEBUG ? 3 : 0,
    'targets' => [
        [
            //保存日誌消息到文件中
            'class' => 'yii\log\FileTarget',
            //指定記錄信息的等級
            'levels' => ['error', 'warning'],
            //向哪個文件輸出信息
            'logFile' => '@runtime/logs/output.log',
        ],
    ],
],

1.2、輸出

public function actionShowPost($id)
{
    $post = $this->findModel($id);
    $diary = '我是日記';
    //記錄一個致命的錯誤,第一個參數爲記錄的變量,第二個參數爲保存日記的文件名
    \Yii::error($diary,'output.log');
}

輸出信息:打開runtime/logs/output.log

2016-11-25 10:28:54 [127.0.0.1][1][-][error][output.log] 我是日記
    in D:\Program Files\phpStudy\WWW\luluyii\modules\post\controllers\DefaultController.php:57
2016-11-25 10:28:54 [127.0.0.1][1][-][info][application] $_GET = [
    'id' => '129'
]

二、更多

2.1、日記消息

Yii::trace():記錄一條消息去跟蹤一段代碼是怎樣運行的。這主要在開發的時候使用。
Yii::info():記錄一條消息來傳達一些有用的信息。
Yii::warning():記錄一個警告消息用來指示一些已經發生的意外。
Yii::error():記錄一個致命的錯誤,這個錯誤應該儘快被檢查。`在這裏插入代碼片`

這些日誌記錄方法針對 嚴重程度 和 類別 來記錄日誌消息。 它們共享相同的函數簽名 function ($message, category=application)category = 'application'),message代表要被 記錄的日誌消息,而 $category 是日誌消息的類別。在下面的示例代碼中,在默認的類別 application 下 記錄了一條跟蹤消息:

Yii::trace(‘start calculating average revenue’);
注意:日誌消息可以是字符串,也可以是複雜的數據,諸如數組或者對象。 log targets 的義務是正確處理日誌消息。默認情況下, 假如一條日誌消息不是一個字符串,它將被導出爲一個字符串,通過調用 yii\helpers\VarDumper::export()

2.2、日誌目標 :一個日誌目標是一個 yii\log\Target 類或者它的子類的實例

yii\log\DbTarget:在數據庫表裏存儲日誌消息。
yii\log\EmailTarget:發送日誌消息到預先指定的郵箱地址。
yii\log\FileTarget:保存日誌消息到文件中.
yii\log\SyslogTarget:通過調用PHP函數 syslog() 將日誌消息保存到系統日誌裏。

2.3、消息過濾:yii\log\Target::levels 、yii\log\Target::categories 、yii\log\Target::except

對於每一個日誌目標,你可以配置它的 yii\log\Target::levels 和 yii\log\Target::categories 屬性來指定哪個消息的嚴重程度和分類目標應該處理。

yii\log\Target::levels 屬性是由一個或者若干個以下值組成的數組:

error:相應的消息通過 Yii::error() 被記錄;
warning:相應的消息通過 Yii::warning() 被記錄;
info:相應的消息通過 Yii::info() 被記錄;
trace:相應的消息通過 Yii::trace() 被記錄;
profile:相應的消息通過 Yii::beginProfile() 和 Yii::endProfile() 被記錄。

如果你沒有指定 yii\log\Target::levels 的屬性, 那就意味着目標將處理 任何 嚴重程度的消息。
yii\log\Target::categories 屬性是一個包含消息分類名稱或者模式的數組:

一個目標將只處理那些在這個數組中能夠找到對應的分類或者其中一個相匹配的模式的消息。
一個分類模式是一個以星號 * 結尾的分類名前綴。
假如一個分類名與分類模式具有相同的前綴, 那麼該分類名將和分類模式相匹配。
例如, yii\db\Command::execute 和 yii\db\Command::query 都是作爲分類名稱運用在 yii\db\Command 類來記錄日誌消息的。 它們都是匹配模式 yii\db*。
假如你沒有指定 yii\log\Target::categories 屬性, 這意味着目標將會處理 任何 分類的消息。
除了通過 yii\log\Target::categories 屬性設置白名單分類,你也可以通過 yii\log\Target::except 屬性來設置某些分類作爲黑名單。

在下面的目標配置中指明瞭目標應該只處理錯誤和警告消息,
當分類的名稱匹配 yii\db* 或者是 yii\web\HttpException:* 的時候, 但是除了

yii\web\HttpException:404[
    'class' => 'yii\log\FileTarget',
    'levels' => ['error', 'warning'],
    'categories' => [
        'yii\db\*',
        'yii\web\HttpException:*',
    ],
    'except' => [
        'yii\web\HttpException:404',
    ],
]

2.4、消息格式化: yii\log\Target::prefix 、 yii\log\Target::logVars

你可以通過配置 yii\log\Target::prefix 的屬性來自定義格式,這個屬性是一個PHP可調用體返回的自定義消息前綴。 例如,下面的代碼配置了一個日誌目標的前綴是每個日誌消息中當前用戶的ID(IP地址和Session ID被刪除是由於隱私的原因)。

[
    'class' => 'yii\log\FileTarget',
    'prefix' => function ($message) {
        $user = Yii::$app->has('user', true) ? Yii::$app->get('user') : null;
        $userID = $user ? $user->getId(false) : '-';
        return "[$userID]";
    }
]

除了消息前綴以外,日誌目標也可以追加一些上下文信息到每組日誌消息中。 默認情況下,這些全局的PHP變量的值被包含在:$_GET, $_POST, $_FILES, COOKIE,_COOKIE,_SESSION 和 $_SERVER 中。 你可以通過配置 yii\log\Target::logVars 屬性適應這個行爲, 這個屬性是你想要通過日誌目標包含的全局變量名稱。 舉個例子,下面的日誌目標配置指明瞭只有 $_SERVER 變量的值將被追加到日誌消息中。

[
    'class' => 'yii\log\FileTarget',
    'logVars' => ['_SERVER'],
]

你可以將 logVars 配置成一個空數組來完全禁止上下文信息包含。
或者假如你想要實現你自己提供上下文信息的方式, 你可以重寫 yii\log\Target::getContextMessage() 方法。

2.5、消息跟蹤級別:yii\log\Dispatcher::traceLevel

在開發的時候,通常希望看到每個日誌消息來自哪裏。這個是能夠被實現的,通過配置 log 組件的 yii\log\Dispatcher::traceLevel 屬性, 就像下面這樣:

return [
    'bootstrap' => ['log'],
    'components' => [
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [...],
        ],
    ],
];

上面的應用配置設置了 yii\log\Dispatcher::traceLevel 的層級,假如 YII_DEBUG 開啓則是3,否則是0。
這意味着,假如 YII_DEBUG 開啓,每個日誌消息在日誌消息被記錄的時候, 將被追加最多3個調用堆棧層級;
假如 YII_DEBUG 關閉, 那麼將沒有調用堆棧信息被包含。

2.6、消息刷新和導出: yii\log\Dispatcher::flushInterval、yii\log\Target::exportInterval

如上所述,通過 yii\log\Logger 對象,日誌消息被保存在一個數組裏。 爲了這個數組的內存消耗,當數組積累了一定數量的日誌消息, 日誌對象每次都將刷新被記錄的消息到 log targets 中。 你可以通過配置 log 組件的 yii\log\Dispatcher::flushInterval 屬性來自定義數量:

return [
    'bootstrap' => ['log'],
    'components' => [
        'log' => [
            'flushInterval' => 100,   // default is 1000
            'targets' => [...],
        ],
    ],
];

當 yii\log\Logger 對象刷新日誌消息到 log targets 的時候,它們並 不能立即獲取導出的消息。相反,消息導出僅僅在一個日誌目標累積了一定數量的過濾消息的時候纔會發生。你可以通過配置 個別的 log targets 的 yii\log\Target::exportInterval 屬性來 自定義這個數量,就像下面這樣:

[
    'class' => 'yii\log\FileTarget',
    'exportInterval' => 100,  // default is 1000
]

因爲刷新和導出層級的設置,默認情況下,當你調用 Yii::trace() 或者任何其他的記錄方法,你將不能在日誌目標中立即看到日誌消息。 這對於一些長期運行的控制檯應用來說可能是一個問題。爲了讓每個日誌消息在日誌目標中能夠立即出現, 你應該設置 yii\log\Dispatcher::flushInterval 和 yii\log\Target::exportInterval 都爲1, 就像下面這樣:

return [
    'bootstrap' => ['log'],
    'components' => [
        'log' => [
            'flushInterval' => 1,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'exportInterval' => 1,
                ],
            ],
        ],
    ],
];

2.7、切換日誌目標: yii\log\Target::enabled

你可以通過配置 yii\log\Target::enabled 屬性來開啓或者禁用日誌目標。 你可以通過日誌目標配置去做,或者是在你的代碼中放入下面的PHP申明:

Yii::$app->log->targets['file']->enabled = false;

上面的代碼要求您將目標命名爲 file,像下面展示的那樣, 在 targets 數組中使用字符串鍵:

return [
    'bootstrap' => ['log'],
    'components' => [
        'log' => [
            'targets' => [
                'file' => [
                    'class' => 'yii\log\FileTarget',
                ],
                'db' => [
                    'class' => 'yii\log\DbTarget',
                ],
            ],
        ],
    ],
];

2.8、創建新的目標

創建一個新的日誌目標類非常地簡單。你主要需要實現 yii\log\Target::export() 方法來發送 yii\log\Target::messages 數組的 內容到一個指定的媒體中。你可以調用 yii\log\Target::formatMessage() 方法去格式化每個消息。

2.9、性能分析

性能分析是一個特殊的消息記錄類型,它通常用在測量某段代碼塊的時間, 並且找出性能瓶頸是什麼。

舉個例子,yii\db\Command 類 使用性能分析找出每個數據庫查詢的時間。

爲了使用性能分析,首先確定需要進行分析的代碼塊。 然後像下面這樣圍住每個代碼塊:


\Yii::beginProfile('myBenchmark');
...code block being profiled...
\Yii::endProfile('myBenchmark');

這裏的 myBenchmark 代表一個唯一標記來標識一個代碼塊。
之後當你檢查分析結果的時候, 你將使用這個標記來定位對應的代碼塊所花費的時間。
對於每個被分析的代碼塊,一個帶有嚴重程度 profile 的日誌消息被記錄。
你可以配置一個 log target 去收集這些 消息,並且導出他們。Yii debugger 有一個內建的性能分析面板能夠展示分析結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章