YII2框架中日志的配置與使用方法實(shí)例分析
本文實(shí)例講述了YII2框架中日志的配置與使用方法。分享給大家供大家參考,具體如下:
YII2中給我們提供了非常方便的日志組件,只需要簡(jiǎn)單配置一下就可以使用。
我們?cè)赾onfig/web.php中配置如下:
return [ //log必須在bootstrap期間就被加載,便于及時(shí)調(diào)度日志消息到目標(biāo) 'bootstrap' => ['log'], 'components' => [ 'log' => [ //消息跟蹤級(jí)別,設(shè)置yii\log\Dispatcher::traceLevel屬性 //YII_DEBUG開啟時(shí),日志消息被記錄時(shí),追加最多3個(gè)調(diào)用堆棧信息 'traceLevel' => YII_DEBUG ? 3 : 0, //日志目標(biāo),可定義多個(gè) 'targets' => [ [ //日志處理器類 'class' => 'yii\log\FileTarget', //日志記錄的級(jí)別 'levels' => ['error', 'warning'], //定義日志文件 'logFile' => '@runtime/logs/test.log', ], ], ], ], ];
通過(guò)下面5個(gè)方法,來(lái)寫入我們自已的日志
//跟蹤 Yii::trace('我是一條跟蹤'); //消息 YII::info('我是一條消息'); //調(diào)試 YII::debug('我是一條調(diào)試'); //警告 YII::warning('我是一條警告'); //錯(cuò)誤 YII::error('我是一條錯(cuò)誤');
注意我們上面定義日志的levels為['error', 'warning'],所以日志只會(huì)記錄這兩個(gè)級(jí)別的信息。
有些時(shí)候我們并不希望把所有日志寫在一起,我們會(huì)根據(jù)不同模塊來(lái)寫日志,這樣以便區(qū)分,這就需要用到日志的分類了。
重新配置config/web.php如下:
'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ //日志處理器類,這里我改用數(shù)據(jù)庫(kù)存日志了 'class' => 'yii\log\DbTarget', //日志記錄的級(jí)別 'levels' => ['error', 'warning'], //追加上下文信息,默認(rèn)YII會(huì)包含PHP全局變量,這里我們不需要,設(shè)為空。 'logVars' => [], //定義分類 'categories' => ['db'], ], [ //日志處理器類,這里我改用數(shù)據(jù)庫(kù)存日志了 'class' => 'yii\log\DbTarget', //日志記錄的級(jí)別 'levels' => ['error', 'warning'], //追加上下文信息,默認(rèn)YII會(huì)包含PHP全局變量,這里我們不需要,設(shè)為空。 'logVars' => [], //定義分類 'categories' => ['pay'], ], ], ],
通過(guò)如下方法,添加我們的日志
//警告 YII::warning('我是一條數(shù)據(jù)庫(kù)警告', 'db'); //錯(cuò)誤 YII::error('我是一條數(shù)據(jù)庫(kù)錯(cuò)誤', 'db'); //警告 YII::warning('我是一條支付警告', 'pay'); //錯(cuò)誤 YII::error('我是一條支付錯(cuò)誤', 'pay');
由于上面的配置我們使用了DbTarget,我們還需要添加一張日志表,用于記錄我們的日志,進(jìn)入項(xiàng)目目錄。運(yù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ù)庫(kù)存日志了 'class' => 'yii\log\DbTarget', //日志記錄的級(jí)別,這里演示設(shè)為info 'levels' => ['info'], //定義分類 'categories' => ['yii\db\*'], ], ], ],
然后我們操作一下數(shù)據(jù)庫(kù),看是否日志記錄了。
<?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ù)庫(kù)存日志了 '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('我是錯(cuò)誤!!!', 'db');
由于沒(méi)有登陸和分模塊,所以沒(méi)獲取到用戶ID和模塊ID,不過(guò)控制器ID和方法ID都獲取到了。
消息的刷新和導(dǎo)出
'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, //消息被存放在一個(gè)數(shù)組里,積累到一定數(shù)量,才會(huì)被刷新到日志target //通過(guò)flushInterval設(shè)置消息刷新到日志target的數(shù)量 'flushInterval' => 100, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], [ //日志處理器類,這里我改用數(shù)據(jù)庫(kù)存日志了 'class' => 'yii\log\DbTarget', //當(dāng)消息刷新到日志對(duì)象時(shí),并不會(huì)立即導(dǎo)出,只有累積到一定數(shù)量才會(huì)導(dǎo)出 //通過(guò)exportInterval來(lái)設(shè)置這個(gè)導(dǎo)出數(shù)量 'exportInterval' => 100, 'levels' => ['error', 'warning'], //定義分類 'categories' => ['db'], ], ], ],
有人會(huì)問(wèn)YII2設(shè)置flushInterval和exportInterval的作用是什么,因?yàn)樵谝恍┫到y(tǒng)中日志的操作會(huì)很頻繁,如果頻繁的讀取文件或數(shù)據(jù)庫(kù)來(lái)寫日志,會(huì)造成嚴(yán)重的IO消耗,降低系統(tǒng)性能,這也是YII2的一個(gè)優(yōu)化吧。
當(dāng)然有些時(shí)候一些長(zhǎng)時(shí)間在控制臺(tái)運(yùn)行的程序,需要立即顯示日志,那么可以通過(guò)如下配置:
'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。
有些時(shí)候我們需要人為的開啟和關(guān)閉某些日志目標(biāo),這時(shí)就需要我們?yōu)槊總€(gè)日志目標(biāo)設(shè)個(gè)鍵,以區(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'], ], ], ],
然后通過(guò)如下,進(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è)計(jì)入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家基于Yii框架的PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
PHP處理二進(jìn)制數(shù)據(jù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇PHP處理二進(jìn)制數(shù)據(jù)的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06PHP設(shè)計(jì)模式之工廠模式(Factory)入門與應(yīng)用詳解
這篇文章主要介紹了PHP設(shè)計(jì)模式之工廠模式(Factory),結(jié)合實(shí)例形式詳細(xì)分析了PHP工廠模式的概念、原理、基本應(yīng)用與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-12-12Zend的Registry機(jī)制的使用說(shuō)明
本篇文章介紹了,Zend的Registry機(jī)制的使用說(shuō)明。需要的朋友參考下2013-05-05利用中國(guó)天氣預(yù)報(bào)接口實(shí)現(xiàn)簡(jiǎn)單天氣預(yù)報(bào)
這篇文章主要介紹了利用中國(guó)天氣預(yù)報(bào)接口實(shí)現(xiàn)簡(jiǎn)單天氣預(yù)報(bào)的示例,大家參考使用吧2014-01-01php桌面中心(一) 創(chuàng)建數(shù)據(jù)庫(kù)
php桌面中心(一) 創(chuàng)建數(shù)據(jù)庫(kù)...2007-03-03Joomla實(shí)現(xiàn)組件中彈出一個(gè)模式(modal)窗口的方法
這篇文章主要介紹了Joomla實(shí)現(xiàn)組件中彈出一個(gè)模式(modal)窗口的方法,列舉了2種常用的Joomla彈出模式窗口的技巧供大家對(duì)比參考,需要的朋友可以參考下2016-05-05