0 follower

ロギング

Yiiには柔軟で拡張可能なログ機能が備わっています。 記録されたメッセージはログレベルとメッセージカテゴリによって分類可能です。 レベルとカテゴリフィルターを使うことで、特定のメッセージをファイルやメール、 ブラウザといった別の送り先に送信することも可能です。

1. メッセージをログに記録する

メッセージは Yii::logYii::traceのどちらかを呼ぶことでログに記録可能です。 この二つのメソッドの違いは、後者はアプリケーションがdebug mode で動いているときだけメッセージを記録するということです。

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

メッセージをログに記録するとき、カテゴリとレベルを指定する必要があります。 カテゴリはxxx.yyy.zzzというフォーマットの文字列です。 これはpath aliasと似ています。 例えば、CControllerでメッセージがログに記録されるとすると、 system.web.CControllerというカテゴリを使うことができるでしょう。 メッセージレベルは以下の値のいずれかになります。

  • trace: Yii::traceによって利用されるレベル 開発の間アプリケーションの実行フローをトレースする

  • info: 一般的な情報向け

  • profile: 後ほど述べるパフォーマンスプロファイルについて

  • warning: 警告メッセージ

  • error: 致命的なエラーメッセージ

2. メッセージルーティング

Yii::logYii::traceによって記録されたメッセージはメモリに一時的に保持されます。 多くの場合、メッセージをブラウザに表示したり、ファイルやメールといった継続的ストレージに保存する必要があります。 これをメッセージルーティングと呼びます。つまり、メッセージを異なった送り先に送信するという意味です。

Yiiにおけるメッセージルーティングは、CLogRouterアプリケーションコンポーネントによって制御されます。 このコンポーネントは、いわゆるログルートのセットを管理します。 各ログルートは一つの送信先を表します。 メッセージはログルートに沿って送信され、レベルとカテゴリによってフィルタすることが可能です。

メッセージルーティングを使うには、CLogRouterアプリケーションコンポーネントをインストールし、 プリロードする必要があります。 また、コンポーネントのroutesプロパティに必要なログルートを設定する必要があります。 以下ではapplication configurationの例を提示します。

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で、これはメッセージをランタイムディレクトリ以下のファイルに保存します。 このルートで保存されるのは、レベルがtraceinfoで、かつカテゴリがsystem.で始まるものだけです。 二番目のルートはCEmailLogRouteで、指定されたメールアドレス宛にメッセージを送信します。 このルートでは、レベルがerrorwarning のものだけが送信されます。

Yiiでは以下のログルートが利用可能です。

  • CDbLogRoute: メッセージをデータベースに保存する
  • CEmailLogRoute: メッセージを指定されたメールアドレスに送信する
  • CFileLogRoute: メッセージをアプリケーションのラン多無ディレクトリ以下にファイルとして保存する
  • CWebLogRoute: メッセージをウェブページの最後に表示する
  • CProfileLogRoute: プロファイルメッセージをウェブページ最後に表示する

情報: メッセージルーティングはリクエストサイクルの最後でonEndRequest イベントが発生したときに 実行されます。 明示的に現在のリクエストの実行を終了するためには、die()exit()ではなく、CApplication::end()を読んでください。 なぜなら、CApplication::end()onEndRequestを発生させ、メッセージが適切にログに記録されるからです。

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

先ほど述べたように、メッセージをログルートに送信する前に、レベルとカテゴリによってフィルタリング可能です。 これはログルートのlevelsプロパティと、 categoriesプロパティを設定することで実現されます。 複数のレベルやカテゴリを記述する場合には、カンマで区切ります。

メッセージカテゴリはxxx.yyy.zzzという書式なので、これらをカテゴリ階層として取り扱えます。 具体的に言うと、xxxxxx.yyyの親であり、さらにxxx.yyyxxx.yyy.zzzの親であるということです。 したがって、xxx.*と書くことで、xxxカテゴリとそれ以下の階層すべてを指し示すことができます。

3. パフォーマンスプロファイリング

パフォーマンスプロファイリングは特殊なメッセージログです。 特定のコードブロックが必要とする実行時間を計測するために使われ、 パフォーマンスのボトルネックがどこにあるかを見つけ出します。

パフォーマンスプロファイリングを使うには、どのコードブロックが計測されるのかを指定する必要があります。 以下のメソッドを、ブロックの最初と最後に挿入することで印をつけます。

Yii::beginProfile('blockID');
...計測対象のコードブロック...
Yii::endProfile('blockID');

blockIDはコードブロックの一意なIDです

コードブロックは適切にネスとする必要があることに注意してください。 すなわち、コードブロックを交差させることはできません。 二つのコードブロックは並列になっているか、一方が片方を完全に含んでいなければなりません。

プロファイルの結果を表示するには、CLogRouterアプリケーションコンポーネントをインストールする必要があります。 これは通常のメッセージルーティングのときと同じです。 CProfileLogRouteルートが計測結果を現在のページの末尾に表示します。