詳解PHP的Yii框架中日志的相關(guān)配置及使用
默認(rèn)的日志是輸出到protected/runtime/application.log
如果需要修改那么需要在main.php里面的 components 下面增加log配置,如下:
'preload' => array('log'),//這句也必須加上 'components' => array( 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( //這是一個文件route表示category為test開頭的所有類型的輸出都會記錄到runtime/test.log下面 array( 'class'=>'CFileLogRoute', 'levels'=>'trace, info, debug, warn, error, fatal, profile', 'categories'=>'test.*', 'maxFileSize'=>1048576,//單文件最大1G 'logFile'=>'test.log', ), // // 開發(fā)過程中所有日志直接輸出到瀏覽器了,這樣不需要登錄服務(wù)器看日志了 array( 'class' => 'CWebLogRoute', 'categories' => 'test.*', 'levels' => CLogger::LEVEL_PROFILE, 'showInFireBug' => true, 'ignoreAjaxInFireBug' => true, ), array( 'class' => 'CWebLogRoute', 'categories' => 'test.* ', ), array( 'class'=>'CEmailLogRoute', 'levels'=>'error, warning', 'emails'=>'admin@example.com', ), ), ), ),
這個log首先被記錄在了內(nèi)存中一個CLogger類的array中,然后會逐一的判斷每個LogRoute,判斷是否需要輸出,注意是逐一判斷,不是其中一個輸出下一個就不管了。
拿上面的配置來說:
第一個CFileLogRoute,'categories'=>'test.*',levels里包含了info, test.xx滿足條件,所以會執(zhí)行,將這條log輸出到test.log中,然后下一個CWebLogRoute, 'levels' => CLogger::LEVEL_PROFILE,。而這條log是info的,所以不會執(zhí)行,再下一個CWebLogRoute,'categories' => 'test.* ',levels沒指定,那就說不過濾,所以這個也會被執(zhí)行,所以這條log將被輸出到瀏覽器中。
二、profile功能
另外logger還有一個很強(qiáng)大的功能:profile,
Yii::beginProfile('blockID'); ...code block being profiled... Yii::endProfile('blockID');
這樣就能測試這個code block的執(zhí)行效率了,非常的方便啊。
更詳細(xì)的配置查看:http://www.yiiframework.com/doc/api/1.1/CProfileLogRoute
然后還有一個很BUG的功能,Profiling SQL Executions
很多時候sql語句寫的不好會非常影響效率的,但是要確定哪一條語句影響了效率就需要profiling了。YII也提供了這個bug級別的功能。
三、Yii::log()和Yii::trace()的使用
首先在config文件中設(shè)置log
'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute',//這表示把日志輸出到文件中,下方有詳細(xì)的 'levels'=>'error, warning', ), array( 'class'=>'CWebLogRoute',//這表示把日志顯示在網(wǎng)頁下方,下方有詳細(xì)的 'levels'=>'trace, info, error, warning', 'categories'=>'cool.*,system.db.*', ), ), ),
日志路由class:
- CDbLogRoute: 將信息保存到數(shù)據(jù)庫的表中。
- CEmailLogRoute: 發(fā)送信息到指定的 Email 地址。
- CFileLogRoute: 保存信息到應(yīng)用程序 runtime 目錄中的一個文件中。
- CWebLogRoute: 將 信息 顯示在當(dāng)前頁面的底部。
- CProfileLogRoute: 在頁面的底部顯示概述(profiling)信息。
信息級別levels:
- trace: 這是在 Yii::trace 中使用的級別。它用于在開發(fā)中 跟蹤程序的執(zhí)行流程。
- info: 這個用于記錄普通的信息。
- profile: 這個是性能概述(profile)。下面馬上會有更詳細(xì)的說明。
- warning: 這個用于警告(warning)信息。
- error: 這個用于致命錯誤(fatal error)信息。
分類categories:
可以自定義,但在輸出函數(shù)里要對應(yīng)才會被寫入日志里
(例如上邊寫的是 cool.* 和 system.db.* ,就會把相應(yīng)分類的信息寫入日志,請結(jié)合下文來理解)
設(shè)置完了,就可以用寫入日志的函數(shù)來記錄了:
Yii::trace('My log message.','cool.pd'); //cool.pd屬于cool.*分類,所以會被寫入日志 Yii::log('My log message.','info','cool.collectpd'); //log定義級別為info,結(jié)合上文,第一個logclass會忽略,不會被寫入文件,但會被第二個logclass接收,寫入日志在網(wǎng)絡(luò)下方顯示。
trace()和log()的區(qū)別:
trace()只會在調(diào)試模式下生效,即開啟debug的時候
trace()不分level,但log()能設(shè)置levels參數(shù)
四、調(diào)試sql query每個語句執(zhí)行的耗時
在配置中的log下加上下面這個Route
//這個配置專門負(fù)責(zé)數(shù)據(jù)庫操作的profile array( 'class'=>'CProfileLogRoute', 'levels' => CLogger::LEVEL_PROFILE, 'showInFireBug' => true, 'ignoreAjaxInFireBug' => true, 'categories' => 'system.db.* ', //只記錄db的操作日志,其他的忽略 ),
然后在某個controller的某個action中加入:
Yii::beginProfile('db', 'pocketpet'); for($i=0;$i<1000;$i++){ $user = UserModel::model()->findByPk("1");//這里只要是數(shù)據(jù)庫操作就行,這個只是個例子 }
Yii::endProfile('db', 'pocketpet');
在瀏覽器中訪問這個action,記得先打開firebug,然后firebug中就能看到如下圖的記錄:
相同的query會進(jìn)行歸類,計算total和average,這個對于分析還是非常有幫助的。
也可以將db的日志寫到文件,配置如下(不建議使用,還是到瀏覽器用firebug方便):
array( 'class'=>'CFileLogRoute', 'levels' => CLogger::LEVEL_PROFILE, 'categories' => 'system.db.* ', //只記錄db的操作日志,其他的忽略 'logFile'=>'db.log', ),
當(dāng)然,想要生效還得有下面兩步配置:
1 . 記得在index.php, 中加入以下配置
$yii = dirname(__FILE__).'/../yii/framework/yii.php'; $config = dirname(__FILE__).'/protected/config/main.php'; defined('YII_DEBUG') or define('YII_DEBUG',true); defined('YII_DEBUG_SHOW_PROFILER') or define('YII_DEBUG_SHOW_PROFILER',true); //enable profiling defined('YII_DEBUG_PROFILING') or define('YII_DEBUG_PROFILING',true); //trace level defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3); //execution time defined('YII_DEBUG_DISPLAY_TIME') or define('YII_DEBUG_DISPLAY_TIME',false); require_once($yii); Yii::createWebApplication($config)->run();
2. 在main.php主配置文件里面,的components db 里將enableProfiling設(shè)置為true
'components' => array( 'db' => array( 'enableProfiling' => true, //這個是用來記錄日志的,會記錄每一條語句執(zhí)行的時間 'enableParamLogging' => true,//true表示包括sql語句的參數(shù)在內(nèi)的信息都會記錄到日志里,非常詳細(xì) ), )
相關(guān)文章
檢查url鏈接是否已經(jīng)有參數(shù)的php代碼 添加 ? 或 &
有時候我們需要檢查 URL 鏈接是否已經(jīng)有參數(shù),然后根據(jù)需要判斷是添加 ? 還是添加 & 在結(jié)尾,這只是一個很小的技巧,但是在做分頁或者頁面跳轉(zhuǎn)時還是有些用處的。2010-02-02PHP入門教程之操作符與控制結(jié)構(gòu)流程詳解
這篇文章主要介紹了PHP入門教程之操作符與控制結(jié)構(gòu)流程,結(jié)合實(shí)例形式詳細(xì)分析了php基本的賦值、自增、比較、三目運(yùn)算符以及if語句、switch語句、for語句等流程控制語句的使用技巧,需要的朋友可以參考下2016-09-09php中使用Imagick實(shí)現(xiàn)圖像直方圖的實(shí)現(xiàn)代碼
玩過單反相機(jī)的人應(yīng)該都知道圖像直方圖(Image Histogram),簡單點(diǎn)說,它通過計算每個色階在總像素中所占的比例來反映圖像的曝光情況。2011-08-08PHP pthreads v3在centos7平臺下的安裝與配置操作方法
這篇文章主要介紹了PHP pthreads v3在centos7平臺下的安裝與配置操作方法,結(jié)合圖文與實(shí)例形式分析了PHP pthreads v3在centos7平臺下的安裝與配置操作具體步驟、相關(guān)命令與注意事項,需要的朋友可以參考下2020-02-02