ホームページ  >  記事  >  php教程  >  YII Framework チュートリアルでのログの使用方法の詳細な説明

YII Framework チュートリアルでのログの使用方法の詳細な説明

高洛峰
高洛峰オリジナル
2016-12-27 14:11:421232ブラウズ

この記事の例では、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=&#39;system.testmod.defaultController&#39;;
    $level=CLogger::LEVEL_INFO;
    $msg=&#39;action begin &#39;;
    Yii::log($msg,$level,$category);
  }
}

YIIのログの出力場所

前述したように、YIIのログの出力場所は多くの場所で定義できます。主に設定ファイルの変更によって行われます。例:

&#39;log&#39;=>array(
  &#39;class&#39;=>&#39;CLogRouter&#39;,
  &#39;routes&#39;=>array(
    array(
      &#39;class&#39;=>&#39;CFileLogRoute&#39;,
      &#39;levels&#39;=>&#39;error, warning&#39;,
    ),
    // uncomment the following to show log messages on web pages
    array(
      &#39;class&#39;=>&#39;CWebLogRoute&#39;,
    ),
  ),
),

はログ ファイルに出力されるだけでなく、Web ページにも出力されます。

設定ファイル内:

routesはログ出力の場所を設定するために使用されます、

classはログ、およびログルートのクラス名です
levelsはログの最上位レベル、つまり文字列シーケンスですセグメント化が簡単です。具体的には CLoogger の定数に対応します

注:

ログ ファイルの保存場所は次のとおりです: /yii_dev/testwebap/protected/runtime/application.log

公式ログは非常に詳細ですが、2 番目のログの中国語翻訳完全な翻訳はここにあります。

Yii は柔軟でスケーラブルなロギング機能を提供します。記録されたログは、ログレベルや情報分類ごとに分類できます。レベルとカテゴリのフィルターを使用すると、選択した情報をファイル、電子メール、ブラウザ ウィンドウなどのさまざまな宛先にさらにルーティングできます。

1. 情報の記録

情報は Yii::log または Yii::trace を通じて記録できます。違いは、後者はアプリケーションがデバッグ モードで実行されている場合にのみ情報をログに記録することです。

Yii::log($message, $level, $category);
Yii::trace($message, $category);

情報を記録する場合、カテゴリとレベルを指定する必要があります。カテゴリはパスのエイリアスと同様の形式の文字列です。 たとえば、メッセージが CController に記録されている場合、分類として system.web.CController を使用できます。情報レベルは次の値のいずれかである必要があります:

trace: これは Yii::trace で使用されるレベルです。開発中にプログラムの実行フローを追跡するために使用されます。

info: これは一般的な情報を記録するために使用されます。
プロフィール:公演概要(プロフィール)です。さらに詳しい手順については、後ほど説明します。
warning: これは警告メッセージに使用されます。
error: これは致命的なエラー メッセージに使用されます。

2. 情報ルーティング

Yii::log または Yii::trace を通じて記録された情報はメモリに保存されます。 通常、それらをブラウザ ウィンドウに表示するか、ファイルや電子メールなどの永続ストレージに保存する必要があります。これはメッセージ ルーティングと呼ばれます。つまり、メッセージをさまざまな宛先に送信します。

Yii では、情報ルーティングは CLogRouter と呼ばれるアプリケーションコンポーネントによって管理されます。 ログルーティングと呼ばれる一連の管理を担当します。各ログ ルートは個別のログの宛先を表します。ログ ルートを通じて送信されたメッセージは、レベルとカテゴリによってフィルタリングされます。

メッセージ ルーティングを使用するには、CLogRouter アプリケーション コンポーネントをインストールしてプリロードする必要があります。また、必要なログ ルートのルート属性を設定する必要もあります。 以下のコードは、必要なアプリケーション構成の例を示しています。

array(
  ......
  &#39;preload&#39;=>array(&#39;log&#39;),
  &#39;components&#39;=>array(
    ......
    &#39;log&#39;=>array(
      &#39;class&#39;=>&#39;CLogRouter&#39;,
      &#39;routes&#39;=>array(
        array(
          &#39;class&#39;=>&#39;CFileLogRoute&#39;,
          &#39;levels&#39;=>&#39;trace, info&#39;,
          &#39;categories&#39;=>&#39;system.*&#39;,
        ),
        array(
          &#39;class&#39;=>&#39;CEmailLogRoute&#39;,
          &#39;levels&#39;=>&#39;error, warning&#39;,
          &#39;emails&#39;=>&#39;admin@example.com&#39;,
        ),
      ),
    ),
  ),
)

上の例では、2 つのログ ルートを定義しました。 1 つ目は CFileLogRoute で、アプリケーションのランタイム ディレクトリにあるファイルに情報を保存します。 また、レベル トレースまたはシステムで始まる情報とカテゴリを含む情報のみが保存されます。 2 番目のルートは CEmailLogRoute で、指定された電子メール アドレスに情報を送信します。エラーまたは警告レベルの情報のみが送信されます。

Yii では、次のログルートが利用可能です:

CDbLogRoute: 情報をデータベーステーブルに保存します。

CEmailLogRoute: 指定された電子メール アドレスに情報を送信します。
CFileLogRoute: アプリケーションのランタイム ディレクトリ内のファイルに情報を保存します。
CWebLogRoute: 現在のページの下部に情報を表示します。
CProfileLogRoute: ページの下部にプロファイリング情報を表示します。

情報: 情報ルーティングは、現在のリクエスト サイクルの最後の onEndRequest イベントがトリガーされたときに発生します。 現在のリクエスト プロセスを明示的に終了するには、die() や exit() を使用する代わりに CApplication::end() を呼び出します。これは、情報がスムーズに記録されるように 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(
  ......
  &#39;preload&#39;=>array(&#39;log&#39;),
  &#39;components&#39;=>array(
    ......
    &#39;log&#39;=>array(
      &#39;class&#39;=>&#39;CLogRouter&#39;,
      &#39;routes&#39;=>array(
        array(
          &#39;class&#39;=>&#39;CFileLogRoute&#39;,
          &#39;levels&#39;=>&#39;error&#39;,
          &#39;filter&#39;=>&#39;CLogFilter&#39;,
        ),
        ...other log routes...
      ),
    ),
  ),
)

从版本1.0.7开始,Yii的日志记录可以采用堆栈的方式记录消息,此功能默认是关闭的,因为它会降低性能。要使用此功能,只需在入口脚本(前includingyii.php)定义一个命名为YII_TRACE_LEVEL的常量即一个大于0的整数。 Yii将在堆栈信息中追加应用程序要到的每一个文件名和行号。可以通过设置YII_TRACE_LEVEL来设定堆栈的层数。这种方式在开发阶段特别有用,因为它可以帮助我们确定触发跟踪消息的地方。

5. Performance Profiling 性能分析

性能分析是一类特殊类型的消息记录。性能分析可用于测量指定代码块所需的时间,并找出性能瓶颈是什么。

要使用性能分析日志,我们需要确定哪些代码块需要分析。我们要在分析性能的代码短的开始和结尾添加如下方法:

Yii::beginProfile(&#39;blockID&#39;);
...code block being profiled...
Yii::endProfile(&#39;blockID&#39;);

其中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中文网!

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。