ホームページ  >  記事  >  バックエンド開発  >  Yii Framework 公式チュートリアル補足 45 - 特別トピック: ロギング

Yii Framework 公式チュートリアル補足 45 - 特別トピック: ロギング

黄舟
黄舟オリジナル
2017-02-16 09:34:001612ブラウズ



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

1. 情報の記録

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


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

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

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

  • info: 通常の情報を記録するために使用されます。

  • Yii Framework 公式チュートリアル補足 45 - 特別トピック: ロギング: 公演概要(プロフィール)です。詳細な手順は後ほど説明します。

  • warning: これは警告メッセージに使用されます。

  • error: これは致命的なエラー メッセージに使用されます。

2. 情報ルーティング

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

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

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


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'=>[email protected]',
                ),
            ),
        ),
    ),
)

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

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

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

  • CEmailLogRoute: 指定された電子メール アドレスに情報を送信します。

  • CFileLogRoute: アプリケーションのランタイム ディレクトリ内のファイルに情報を保存します。

  • CWebLogRoute: 現在のページの下部に情報を表示します。

  • CProfileLogRoute: ページの下部にプロファイリング情報を表示します。

情報: 情報ルーティングは、現在のリクエスト サイクルの最後の onEndRequest イベントがトリガーされたときに発生します。 現在のリクエスト プロセスを明示的に終了するには、die() や exit() を使用する代わりに CApplication::end() を呼び出してください。これは、情報がスムーズに記録されるように CApplication::end() が onEndRequest イベントをトリガーするためです。

3. メッセージ フィルタリング

前述したように、メッセージはログ ルーターに送信される前にレベルとカテゴリによってフィルタリングできます。 これは、対応するログ ルートのレベルとカテゴリの属性を設定することによって行われます。 複数のレベルまたはカテゴリはカンマで接続する必要があります。

情報の分類はxxx.yyy.zzz形式に似ているので、分類レベルとみなすことができます。 具体的には、xxx は xxx.yyy の親であり、xxx.yyy は xxx.yyy.zzz の親であると言います。 このようにして、xxx​​.* を使用して、カテゴリ xxx とそのすべての子および孫カテゴリを表すことができます。

4. コンテキスト情報を記録する

バージョン 1.0.6 以降では、PHP の事前定義変数 ($_GET、$_SERVER など)、セッション ID、ユーザー名などの追加のコンテキスト情報を記録するように設定できます。 これは、ログ ルートの CLogRoute::filter 属性で適切なログ フィルタリング ルールを指定することによって実現されます。

框架使用非常方面的可以用于大多数日志过滤的CLogFilter,默认情况下, CLogFilter 将会记录一条包含变量(如通常包含系统上下文变量值的如$_GET,$_SERVER等)的信息。CLogFilter还可以用于配置到每一个日志信息之前,带上session 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支持记录通过调用Yii::trace返回的日志记录信息中的回调栈信息。这一特性默认是取消的,因为这回降低性能。想要使用这一特性,只需在入口脚本中定义一个名为YII_TRACE_LEVEL的大于0的常量 (在包含yii.php之前),然后Yii将会在每一个trace信息之后加上应用代码回调栈的文件名和行号。 YII_TRACE_LEVEL 决定了每一个回调栈的层级将会被记录。这个信息在开发期间很有用,因为这可以帮助我们确定触发trace信息的位置。

5. 性能分析

性能分析是一个特殊的日志记录类型。性能分析可以用于衡量指定代码块的运行时间,并且找出性能瓶颈。

使用性能分析,我们需要指定被分析的代码块。我们通过插入如下代码来标记每一个代码块的开始和结束:


Yii::beginProfile('blockID');
...code block being Yii Framework 公式チュートリアル補足 45 - 特別トピック: ロギングd...
Yii::endProfile('blockID');

其中blockID 指的是代码块的唯一标志符.

注意, 代码块需要被合理嵌套。也就是说,一个代码块不能和另一代码块交叉嵌套:要么是并行的,要么是完全封闭包含在另一个代码块里。

为了显示分析结果, 需要安装 一个包含CProfileLogRoute日志路由的CLogRouter 应用组件。这和我们处理其他的信息路由一样,CProfileLogRoute路由将会在当前页面的底部显示性能分析结果。

Yii Framework 公式チュートリアル補足 45 - 特別トピック: ロギング

6. SQL执行分析

性能分析在处理数据库操作时尤为有用,因为 SQL 执行经常是一个应用主要的性能瓶颈。 我们当然可以在每一次SQL执行的地方插入beginProfile 和 endProfile语句, 从版本1.0.6开始, 但Yii 提供了一个更加系统的方式来解决这个问题。

通过在应用配置中设置 CDbConnection::enableProfiling 为true, 每一个被执行的SQL语句都会被分析. 结果可以通过设置前面提到的CProfileLogRoute来显示, 这样我们就能知晓每一个SQL语句的执行时间。除此之外我们还可以调用CDbConnection::getStats() 来取回SQL语句执行的次数和总的执行时间。

 以上就是Yii框架官方教程增补版45——专题:日志记录的内容,更多相关内容请关注PHP中文网(www.php.cn)!


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