本文實例講述了YII Framework框架日誌用法。分享給大家供大家參考,具體如下:
日誌的作用(此處省略1000字)
YII中的日誌很好很強大,允許你把日誌資訊存放到資料庫,發送到製定email,存放咋文件中,意見顯示頁面是,甚至可以用來做效能分析。
YII中日誌的基本配置:/yii_dev/testwebap/protected/config/main.php
'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'error, warning', ), // uncomment the following to show log messages on web pages /* array( 'class'=>'CWebLogRoute', ), */ ), ),
YII中日誌的基本使用:
可以透過YII提供的Yii::log和Yii::trace進行日誌資訊的輸出,兩者的差別看看定義就知道了。
函數定義
public static function trace($msg,$category='application') { if(YII_DEBUG) self::log($msg,CLogger::LEVEL_TRACE,$category); } public static function log($msg,$level=CLogger::LEVEL_INFO,$category='application') { if(self::$_logger===null) self::$_logger=new CLogger; if(YII_DEBUG && YII_TRACE_LEVEL>0 && $level!==CLogger::LEVEL_PROFILE) { $traces=debug_backtrace(); $count=0; foreach($traces as $trace) { if(isset($trace['file'],$trace['line']) && strpos($trace['file'],YII_PATH)!==0) { $msg.="\nin ".$trace['file'].' ('.$trace['line'].')'; if(++$count>=YII_TRACE_LEVEL) break; } } } self::$_logger->log($msg,$level,$category); }
$msg:你要輸出的日誌資訊
$category:日誌資訊所屬分類
$level:日誌資訊的層級:
const LEVEL_TRACE'trace';程式執行流程
const LEVEL_WARNING='warning';警告訊息
const LEVEL_ERROR='error';致命錯誤訊息
const LEVEL_INFO='info';普通提示訊息
const LEVEL_PROFILE='profile';方法舉例
<?php class DefaultController extends Controller { public function actionCache () { $category='system.testmod.defaultController'; $level=CLogger::LEVEL_INFO; $msg='action begin '; Yii::log($msg,$level,$category); } }
YII中日誌的輸出位置
上文提到YII中日誌的輸出位置可以定義為許多位置。主要透過設定檔修改例如:
'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'error, warning', ), // uncomment the following to show log messages on web pages array( 'class'=>'CWebLogRoute', ), ), ),
不僅輸出到日誌檔案中,還輸出到web頁面。
設定檔中:
routes用於設定日誌輸出的位置,
class是日誌,日誌路由的類別名稱levels是日誌的頂級,字串序列,用都好分割。具體對應CLooger中的常數
注意:
日誌檔案的存放位置是:/yii_dev/testwebap/protected/runtime/application.log
官方的日誌介紹的很詳細,但是後半部中文翻譯缺失了,這裡進行翻譯補全。
Yii 提供了一個靈活可擴充的日誌功能。記錄的日誌 可以透過日誌等級和資訊分類進行歸類。透過使用 等級和分類過濾器,所選的資訊還可以進一步路由到 不同的目的地,例如一個文件,Email,瀏覽器視窗等。
1. 資訊記錄
資訊可以透過 Yii::log 或 Yii::trace 記錄。其 差異在於後者只在當應用程式運行在 偵錯模式(debug mode) 中時才會記錄資訊。
Yii::log($message, $level, $category); Yii::trace($message, $category);
當記錄資訊時,我們需要指定它的分類和等級 分類是一段格式類似於 路徑別名 的字串。 例如,如果一則資訊是在 CController 中記錄的,我們可以使用 system.web.CController 作為分類。資訊等級應該是下列值中的一種:
trace: 這是在 Yii::trace 中使用的層級。它用於在開發中 追蹤程式的執行流程。
info: 這個用來記錄普通的資訊。profile: 這個是效能概述(profile)。下面馬上會有更詳細的說明。
warning: 這個用於警告(warning)訊息。
error: 這個用於致命錯誤(fatal error)訊息。
2. 資訊路由
透過 Yii::log 或 Yii::trace 所記錄的資訊是保存在記憶體中的。 我們通常需要將它們顯示到瀏覽器視窗中,或將他們保存到一些 持久性儲存例如文件、Email中。這個就叫作 訊息路由,例如, 發送訊息到不同的目的地。
在 Yii 中,資訊路由是由一個叫做 CLogRouter 的應用元件管理的。 它負責管理一系列稱作 日誌路由 的東西。每個日誌路由 代表一個單獨的日誌目的地。透過一個日誌路由發送的訊息會被他們的等級和分類過濾。
要使用資訊路由,我們需要安裝並預先載入一個 CLogRouter 應用元件。我們也還需要配置它的 routes 屬性為我們想要的那些日誌路由。 下面的程式碼示範了一個所需的 應用程式設定 範例:
array( ...... 'preload'=>array('log'), 'components'=>array( ...... 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'trace, info', 'categories'=>'system.*', ), array( 'class'=>'CEmailLogRoute', 'levels'=>'error, warning', 'emails'=>'admin@example.com', ), ), ), ), )
在上面的範例中,我們定義了兩個日誌路由。第一個是 CFileLogRoute ,它會把資訊保存在位於應用程式 runtime 目錄中的一個檔案中。 而且只有等級為 trace 或 info 、分類以 system. 開頭的資訊才會被儲存。 第二個路由是 CEmailLogRoute ,它會將訊息傳送到指定的 email 位址,只有層級為 error 或 warning 的才會傳送。
在 Yii 中,有下列幾種日誌路由可用:
CDbLogRoute: 將資訊儲存到資料庫的表中。
CEmailLogRoute: 發送訊息到指定的 Email 位址。CFileLogRoute: 將資訊儲存到應用程式 runtime 目錄中的一個檔案。
CWebLogRoute: 將 資訊 顯示在目前頁面的底部。
CProfileLogRoute: 在頁面的底部顯示概述(profiling)資訊。
訊息: 訊息路由發生在目前請求週期最後的 onEndRequest 事件觸發時。 若要明確終止目前請求過程,請呼叫 CApplication::end() 而非使用 die() 或 exit(),因為 CApplication::end() 將會觸發onEndRequest 事件, 這樣資訊才會被順利記錄。
3. 訊息過濾
正如我们所提到的,信息可以在他们被发送到一个日志路由之前通过它们的级别和分类过滤。 这是通过设置对应日志路由的 levels 和 categories 属性完成的。 多个级别或分类应使用逗号连接。
由于信息分类是类似 xxx.yyy.zzz 格式的,我们可以将其视为一个分类层级。 具体地,我们说 xxx 是 xxx.yyy的父级,而xxx.yyy 又是 xxx.yyy.zzz 的父级。 这样我们就可以使用 xxx.* 表示分类 xxx 及其所有的子级和孙级分类
4. 记录上下文信息
从版本 1.0.6 起,我们可以设置记录附加的上下文信息, 比如 PHP 的预定义变量(例如 $_GET, $_SERVER),session ID,用户名等。 这是通过指定一个日志路由的 CLogRoute::filter属性为一个合适的日志过滤规则实现的。
框架可能在许多数情况下会用到日志过滤器CLogFilter来过滤日志。默认情况下,CLogFilter日志消息包含了许多系统上下文信息的变量,像$ _GET,$_SERVER。 CLogFilter也可以配置的前缀与会话ID,用户名等,我们在检查无数记录的消息每个记录的消息时,这可能会极大地简化了搜索难度
下面的配置显示了如何启用日志记录的上下文信息。请注意,每个日志路由可能有其自己的日志过滤器。 默认情况下,日志路由不会有日志筛选器。
array( ...... 'preload'=>array('log'), 'components'=>array( ...... 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'error', 'filter'=>'CLogFilter', ), ...other log routes... ), ), ), )
从版本1.0.7开始,Yii的日志记录可以采用堆栈的方式记录消息,此功能默认是关闭的,因为它会降低性能。要使用此功能,只需在入口脚本(前includingyii.php)定义一个命名为YII_TRACE_LEVEL的常量即一个大于0的整数。 Yii将在堆栈信息中追加应用程序要到的每一个文件名和行号。可以通过设置YII_TRACE_LEVEL来设定堆栈的层数。这种方式在开发阶段特别有用,因为它可以帮助我们确定触发跟踪消息的地方。
5. Performance Profiling 性能分析
性能分析是一类特殊类型的消息记录。性能分析可用于测量指定代码块所需的时间,并找出性能瓶颈是什么。
要使用性能分析日志,我们需要确定哪些代码块需要分析。我们要在分析性能的代码短的开始和结尾添加如下方法:
Yii::beginProfile('blockID'); ...code block being profiled... Yii::endProfile('blockID');
其中blockID是一个标识代码块的唯一ID。
注意,这些方法不能交叉嵌套
为了显示分析结果,我们需要为CLogRouter增加CProfileLogRoute路由。然后通过CProfileLogRoute可以把性能测试结果显示在当前页面结束。
6. Profiling SQL Executions 分析SQL执行
在数据库开发中分析是特别有用的,因为SQL执行往往是应用程序的主要性能瓶颈。尽管我们可以手动在每个SQL执行的适当的地方插入beginProfile和endProfile来衡量花费的时间,但从1.0.6版本开始,Yii提供了更系统的方法来解决这个问题。
再实际的应用程序当中通过设置CDbConnection::enableProfiling爱分析每一个正在执行的SQL语句。使用 CProfileLogRoute,结果可以很容易地显示。它可以显示我们是在执行什么SQL语句花费多少时间。我们也可以调用CDbConnection:getStats()来分析检索SQL语句的执行总数和其总的执行时间。
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。
更多YII Framework框架教程之日志用法详解相关文章请关注PHP中文网!