この記事の例では、YII Framework フレームワーク ログの使用方法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:
ログの役割 (ここでは1000語省略)
YIIのログは非常に優れており強力で、データベースにログ情報を保存できます。指定のメールに送信し、ファイルに保存します。 意見表示ページでは、パフォーマンス分析にも使用できます。
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::log および Yii::trace を通じて取得できます。 YII の出力、定義を見ると 2 つの違いがわかります。
関数定義
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_INFO='info'; 通常のプロンプト情報
const LEVEL_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); } }
'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', ), ), ),
classはログ、およびログルートのクラス名です
levelsはログの最上位レベル、つまり文字列シーケンスですセグメント化が簡単です。具体的には CLoogger の定数に対応します
Yii::log($message, $level, $category); Yii::trace($message, $category);
info: これは一般的な情報を記録するために使用されます。
プロフィール:公演概要(プロフィール)です。さらに詳しい手順については、後ほど説明します。
warning: これは警告メッセージに使用されます。
error: これは致命的なエラー メッセージに使用されます。
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', ), ), ), ), )
CEmailLogRoute: 指定された電子メール アドレスに情報を送信します。
CFileLogRoute: アプリケーションのランタイム ディレクトリ内のファイルに情報を保存します。
CWebLogRoute: 現在のページの下部に情報を表示します。
CProfileLogRoute: ページの下部にプロファイリング情報を表示します。
正如我们所提到的,信息可以在他们被发送到一个日志路由之前通过它们的级别和分类过滤。 这是通过设置对应日志路由的 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中文网!