本文實例講述了YII2框架中日志的配置與使用方法。分享給大家供大家參考,具體如下:
YII2中給我們提供了非常方便的日志組件,只需要簡單配置一下就可以使用。
我們在config/web.php中配置如下:
return [
//log必須在bootstrap期間就被加載,便于及時調(diào)度日志消息到目標(biāo)
'bootstrap' => ['log'],
'components' => [
'log' => [
//消息跟蹤級別,設(shè)置yii\log\Dispatcher::traceLevel屬性
//YII_DEBUG開啟時,日志消息被記錄時,追加最多3個調(diào)用堆棧信息
'traceLevel' => YII_DEBUG ? 3 : 0,
//日志目標(biāo),可定義多個
'targets' => [
[
//日志處理器類
'class' => 'yii\log\FileTarget',
//日志記錄的級別
'levels' => ['error', 'warning'],
//定義日志文件
'logFile' => '@runtime/logs/test.log',
],
],
],
],
];
通過下面5個方法,來寫入我們自已的日志
//跟蹤
Yii::trace('我是一條跟蹤');
//消息
YII::info('我是一條消息');
//調(diào)試
YII::debug('我是一條調(diào)試');
//警告
YII::warning('我是一條警告');
//錯誤
YII::error('我是一條錯誤');
注意我們上面定義日志的levels為['error', 'warning'],所以日志只會記錄這兩個級別的信息。
有些時候我們并不希望把所有日志寫在一起,我們會根據(jù)不同模塊來寫日志,這樣以便區(qū)分,這就需要用到日志的分類了。
重新配置config/web.php如下:
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
//日志處理器類,這里我改用數(shù)據(jù)庫存日志了
'class' => 'yii\log\DbTarget',
//日志記錄的級別
'levels' => ['error', 'warning'],
//追加上下文信息,默認(rèn)YII會包含PHP全局變量,這里我們不需要,設(shè)為空。
'logVars' => [],
//定義分類
'categories' => ['db'],
],
[
//日志處理器類,這里我改用數(shù)據(jù)庫存日志了
'class' => 'yii\log\DbTarget',
//日志記錄的級別
'levels' => ['error', 'warning'],
//追加上下文信息,默認(rèn)YII會包含PHP全局變量,這里我們不需要,設(shè)為空。
'logVars' => [],
//定義分類
'categories' => ['pay'],
],
],
],
通過如下方法,添加我們的日志
//警告
YII::warning('我是一條數(shù)據(jù)庫警告', 'db');
//錯誤
YII::error('我是一條數(shù)據(jù)庫錯誤', 'db');
//警告
YII::warning('我是一條支付警告', 'pay');
//錯誤
YII::error('我是一條支付錯誤', 'pay');
由于上面的配置我們使用了DbTarget,我們還需要添加一張日志表,用于記錄我們的日志,進(jìn)入項目目錄。運行如下命令:
yii migrate --migrationPath=@yii/log/migrations
當(dāng)然categories我們也可以指定為YII的類
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
[
//日志處理器類,這里我改用數(shù)據(jù)庫存日志了
'class' => 'yii\log\DbTarget',
//日志記錄的級別,這里演示設(shè)為info
'levels' => ['info'],
//定義分類
'categories' => ['yii\db\*'],
],
],
],
然后我們操作一下數(shù)據(jù)庫,看是否日志記錄了。
?php
namespace app\controllers;
use YII;
use yii\db\Query;
use yii\web\Controller;
class TestController extends Controller
{
public function actionTest()
{
$data = (new Query())->from('{{%user}}')
->where('id=:id', [':id' => '1'])
->all();
var_dump($data);
}
}
日志消息的格式化,我們可以自定義日志的前綴。
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
[
//日志處理器類,這里我改用數(shù)據(jù)庫存日志了
'class' => 'yii\log\DbTarget',
'levels' => ['error', 'warning'],
//定義分類
'categories' => ['db'],
//定義前綴
'prefix' => function($message) {
$uid = !empty(YII::$app->user->id) ? YII::$app->user->id : '-';
$mid = !empty(YII::$app->module->id) ? YII::$app->module->id : '-';
$cid = !empty(YII::$app->controller->id) ? YII::$app->controller->id : '-';
$aid = !empty(YII::$app->controller->action->id) ? YII::$app->controller->action->id : '-';
return "[{$uid}][{$mid}/{$cid}/{$aid}]";
},
],
],
],
使用如下代碼,記錄日志,查看效果
YII::warning('我是警告!!!', 'db');
YII::error('我是錯誤!!!', 'db');
由于沒有登陸和分模塊,所以沒獲取到用戶ID和模塊ID,不過控制器ID和方法ID都獲取到了。
消息的刷新和導(dǎo)出
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
//消息被存放在一個數(shù)組里,積累到一定數(shù)量,才會被刷新到日志target
//通過flushInterval設(shè)置消息刷新到日志target的數(shù)量
'flushInterval' => 100,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
[
//日志處理器類,這里我改用數(shù)據(jù)庫存日志了
'class' => 'yii\log\DbTarget',
//當(dāng)消息刷新到日志對象時,并不會立即導(dǎo)出,只有累積到一定數(shù)量才會導(dǎo)出
//通過exportInterval來設(shè)置這個導(dǎo)出數(shù)量
'exportInterval' => 100,
'levels' => ['error', 'warning'],
//定義分類
'categories' => ['db'],
],
],
],
有人會問YII2設(shè)置flushInterval和exportInterval的作用是什么,因為在一些系統(tǒng)中日志的操作會很頻繁,如果頻繁的讀取文件或數(shù)據(jù)庫來寫日志,會造成嚴(yán)重的IO消耗,降低系統(tǒng)性能,這也是YII2的一個優(yōu)化吧。
當(dāng)然有些時候一些長時間在控制臺運行的程序,需要立即顯示日志,那么可以通過如下配置:
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'flushInterval' => 1,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
[
'class' => 'yii\log\FileTarget',
'exportInterval' => 1,
'levels' => ['error', 'warning'],
//定義分類
'categories' => ['db'],
],
],
],
將flushInterval和exportInterval分別設(shè)為1。
有些時候我們需要人為的開啟和關(guān)閉某些日志目標(biāo),這時就需要我們?yōu)槊總€日志目標(biāo)設(shè)個鍵,以區(qū)分。
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
'pay' => [
'class' => 'yii\log\DbTarget',
'levels' => ['error', 'warning'],
'categories' => ['pay'],
],
'db' => [
'class' => 'yii\log\DbTarget',
'levels' => ['error', 'warning'],
'categories' => ['db'],
],
],
],
然后通過如下,進(jìn)行開啟和關(guān)閉:
//關(guān)閉
Yii::$app->log->targets['db']->enabled = false;
//開啟
Yii::$app->log->targets['db']->enabled = true;
更多關(guān)于Yii相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Yii框架入門及常用技巧總結(jié)》、《php優(yōu)秀開發(fā)框架總結(jié)》、《smarty模板入門基礎(chǔ)教程》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家基于Yii框架的PHP程序設(shè)計有所幫助。
您可能感興趣的文章:- yii2.0框架實現(xiàn)上傳excel文件后導(dǎo)入到數(shù)據(jù)庫的方法示例
- YII2框架中查詢生成器Query()的使用方法示例
- YII2框架中使用RBAC對模塊,控制器,方法的權(quán)限控制及規(guī)則的使用示例
- YII2框架中behavior行為的理解與使用方法示例
- YII2 全局異常處理深入講解