YII Framework框架教程之日志用法详解
本文实例讲述了YIIFramework框架日志用法。分享给大家供大家参考,具体如下:
日志的作用(此处省略1000字)
YII中的日志很好很强大,允许你把日志信息存放到数据库,发送到制定email,存放咋文件中,意见显示页面是,甚至可以用来做性能分析。
YII中日志的基本配置:/yii_dev/testwebap/protected/config/main.php
'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'error,warning', ), //uncommentthefollowingtoshowlogmessagesonwebpages /* array( 'class'=>'CWebLogRoute', ), */ ), ),
YII中日志的基本使用:
可以通过YII提供的Yii::log和Yii::trace进行日志信息的输出,两者的区别看看定义就知道了。
函数定义
publicstaticfunctiontrace($msg,$category='application') { if(YII_DEBUG) self::log($msg,CLogger::LEVEL_TRACE,$category); } publicstaticfunctionlog($msg,$level=CLogger::LEVEL_INFO,$category='application') { if(self::$_logger===null) self::$_logger=newCLogger; if(YII_DEBUG&&YII_TRACE_LEVEL>0&&$level!==CLogger::LEVEL_PROFILE) { $traces=debug_backtrace(); $count=0; foreach($tracesas$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:日志信息的级别:
constLEVEL_TRACE='trace';用于调试环境,追踪程序执行流程
constLEVEL_WARNING='warning';警告信息
constLEVEL_ERROR='error';致命错误信息
constLEVEL_INFO='info';普通提示信息
constLEVEL_PROFILE='profile';性能调试信息
基本使用方法举例
<?php classDefaultControllerextendsController { publicfunctionactionCache() { $category='system.testmod.defaultController'; $level=CLogger::LEVEL_INFO; $msg='actionbegin'; Yii::log($msg,$level,$category); } }
YII中日志的输出位置
上文提到YII中日志的输出位置可以定义为很多位置。主要通过配置文件修改例如:
'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'error,warning', ), //uncommentthefollowingtoshowlogmessagesonwebpages array( 'class'=>'CWebLogRoute', ), ), ),
不仅输出到日志文件中,还输出到web页面上。
配置文件中:
routes用于配置日志输出的位置,
class是日志,日志路由的类名
levels是日志的顶级,字符串序列,用都好分割。具体对应CLooger中的常量
注意:
日志文件的存放位置是:/yii_dev/testwebap/protected/runtime/application.log
官方的日志介绍的很详细,但是后半部分中文翻译缺失了,这里进行翻译补全。
Yii提供了一个灵活可扩展的日志功能。记录的日志可以通过日志级别和信息分类进行归类。通过使用级别和分类过滤器,所选的信息还可以进一步路由到不同的目的地,例如一个文件,Email,浏览器窗口等。
1.信息记录
信息可以通过Yii::log或Yii::trace记录。其区别是后者只在当应用程序运行在调试模式(debugmode)中时才会记录信息。
Yii::log($message,$level,$category); Yii::trace($message,$category);
当记录信息时,我们需要指定它的分类和级别分类是一段格式类似于路径别名的字符串。例如,如果一条信息是在CController中记录的,我们可以使用system.web.CController作为分类。信息级别应该是下列值中的一种:
trace:这是在Yii::trace中使用的级别。它用于在开发中跟踪程序的执行流程。
info:这个用于记录普通的信息。
profile:这个是性能概述(profile)。下面马上会有更详细的说明。
warning:这个用于警告(warning)信息。
error:这个用于致命错误(fatalerror)信息。
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),sessionID,用户名等。这是通过指定一个日志路由的CLogRoute::filter属性为一个合适的日志过滤规则实现的。
TheframeworkcomeswiththeconvenientCLogFilterthatmaybeusedastheneededlogfilterinmostcases.Bydefault,CLogFilterwilllogamessagewithvariableslike$_GET,$_SERVERwhichoftencontainsvaluablesystemcontextinformation.CLogFiltercanalsobeconfiguredtoprefixeachloggedmessagewithsessionID,username,etc.,whichmaygreatlysimplifyingtheglobalsearchwhenwearecheckingthenumerousloggedmessages.
框架可能在许多数情况下会用到日志过滤器CLogFilter来过滤日志。默认情况下,CLogFilter日志消息包含了许多系统上下文信息的变量,像$_GET,$_SERVER。CLogFilter也可以配置的前缀与会话ID,用户名等,我们在检查无数记录的消息每个记录的消息时,这可能会极大地简化了搜索难度
Thefollowingconfigurationshowshowtoenableloggingcontextinformation.Notethateachlogroutemayhaveitsownlogfilter.Andbydefault,alogroutedoesnothavealogfilter.
下面的配置显示了如何启用日志记录的上下文信息。请注意,每个日志路由可能有其自己的日志过滤器。默认情况下,日志路由不会有日志筛选器。
array( ...... 'preload'=>array('log'), 'components'=>array( ...... 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'error', 'filter'=>'CLogFilter', ), ...otherlogroutes... ), ), ), )
Startingfromversion1.0.7,YiisupportsloggingcallstackinformationinthemessagesthatareloggedbycallingYii::trace.Thisfeatureisdisabledbydefaultbecauseitlowersperformance.Tousethisfeature,simplydefineaconstantnamedYII_TRACE_LEVELatthebeginningoftheentryscript(beforeincludingyii.php)tobeanintegergreaterthan0.Yiiwillthenappendtoeverytracemessagewiththefilenameandlinenumberofthecallstacksbelongingtoapplicationcode.ThenumberYII_TRACE_LEVELdetermineshowmanylayersofeachcallstackshouldberecorded.Thisinformationisparticularlyusefulduringdevelopmentstageasitcanhelpusidentifytheplacesthattriggerthetracemessages.
从版本1.0.7开始,Yii的日志记录可以采用堆栈的方式记录消息,此功能默认是关闭的,因为它会降低性能。要使用此功能,只需在入口脚本(前includingyii.php)定义一个命名为YII_TRACE_LEVEL的常量即一个大于0的整数。Yii将在堆栈信息中追加应用程序要到的每一个文件名和行号。可以通过设置YII_TRACE_LEVEL来设定堆栈的层数。这种方式在开发阶段特别有用,因为它可以帮助我们确定触发跟踪消息的地方。
5.PerformanceProfiling性能分析
Performanceprofilingisaspecialtypeofmessagelogging.Performanceprofilingcanbeusedtomeasurethetimeneededforthespecifiedcodeblocksandfindoutwhattheperformancebottleneckis.
性能分析是一类特殊类型的消息记录。性能分析可用于测量指定代码块所需的时间,并找出性能瓶颈是什么。
Touseperformanceprofiling,weneedtoidentifywhichcodeblocksneedtobeprofiled.Wemarkthebeginningandtheendofeachcodeblockbyinsertingthefollowingmethods:
要使用性能分析日志,我们需要确定哪些代码块需要分析。我们要在分析性能的代码短的开始和结尾添加如下方法:
Yii::beginProfile('blockID'); ...codeblockbeingprofiled... Yii::endProfile('blockID');
whereblockIDisanIDthatuniquelyidentifiesthecodeblock.
其中blockID是一个标识代码块的唯一ID。
Note,codeblocksneedtobenestedproperly.Thatis,acodeblockcannotintersectwithanother.Itmustbeeitherataparallellevelorbecompletelyenclosedbytheothercodeblock.
注意,这些方法不能交叉嵌套
Toshowprofilingresult,weneedtoinstallaCLogRouterapplicationcomponentwithaCProfileLogRoutelogroute.Thisisthesameaswedowithnormalmessagerouting.TheCProfileLogRouteroutewilldisplaytheperformanceresultsattheendofthecurrentpage.
为了显示分析结果,我们需要为CLogRouter增加CProfileLogRoute路由。然后通过CProfileLogRoute可以把性能测试结果显示在当前页面结束。
6.ProfilingSQLExecutions分析SQL执行
ProfilingisespeciallyusefulwhenworkingwithdatabasesinceSQLexecutionsareoftenthemainperformancebottleneckofanapplication.WhilewecanmanuallyinsertbeginProfileandendProfilestatementsatappropriateplacestomeasurethetimespentineachSQLexecution,startingfromversion1.0.6,Yiiprovidesamoresystematicapproachtosolvethisproblem.
在数据库开发中分析是特别有用的,因为SQL执行往往是应用程序的主要性能瓶颈。尽管我们可以手动在每个SQL执行的适当的地方插入beginProfile和endProfile来衡量花费的时间,但从1.0.6版本开始,Yii提供了更系统的方法来解决这个问题。
BysettingCDbConnection::enableProfilingtobetrueintheapplicationconfiguration,everySQLstatementbeingexecutedwillbeprofiled.TheresultscanbereadilydisplayedusingtheaforementionedCProfileLogRoute,whichcanshowushowmuchtimeisspentinexecutingwhatSQLstatement.WecanalsocallCDbConnection::getStats()toretrievethetotalnumberSQLstatementsexecutedandtheirtotalexecutiontime.
再实际的应用程序当中通过设置CDbConnection::enableProfiling爱分析每一个正在执行的SQL语句。使用CProfileLogRoute,结果可以很容易地显示。它可以显示我们是在执行什么SQL语句花费多少时间。我们也可以调用CDbConnection:getStats()来分析检索SQL语句的执行总数和其总的执行时间。
更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。