Yiiには柔軟で拡張可能なログ機能が備わっています。 記録されたメッセージはログレベルとメッセージカテゴリによって分類可能です。 レベルとカテゴリフィルターを使うことで、特定のメッセージをファイルやメール、 ブラウザといった別の送り先に送信することも可能です。
メッセージは Yii::logかYii::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
: 致命的なエラーメッセージ
Yii::logかYii::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で、これはメッセージをランタイムディレクトリ以下のファイルに保存します。
このルートで保存されるのは、レベルがtrace
か info
で、かつカテゴリがsystem.
で始まるものだけです。
二番目のルートはCEmailLogRouteで、指定されたメールアドレス宛にメッセージを送信します。
このルートでは、レベルがerror
か warning
のものだけが送信されます。
Yiiでは以下のログルートが利用可能です。
情報: メッセージルーティングはリクエストサイクルの最後でonEndRequest イベントが発生したときに 実行されます。 明示的に現在のリクエストの実行を終了するためには、
die()
やexit()
ではなく、CApplication::end()を読んでください。 なぜなら、CApplication::end()はonEndRequestを発生させ、メッセージが適切にログに記録されるからです。
先ほど述べたように、メッセージをログルートに送信する前に、レベルとカテゴリによってフィルタリング可能です。 これはログルートのlevelsプロパティと、 categoriesプロパティを設定することで実現されます。 複数のレベルやカテゴリを記述する場合には、カンマで区切ります。
メッセージカテゴリはxxx.yyy.zzz
という書式なので、これらをカテゴリ階層として取り扱えます。
具体的に言うと、xxx
はxxx.yyy
の親であり、さらにxxx.yyy
はxxx.yyy.zzz
の親であるということです。
したがって、xxx.*
と書くことで、xxx
カテゴリとそれ以下の階層すべてを指し示すことができます。
パフォーマンスプロファイリングは特殊なメッセージログです。 特定のコードブロックが必要とする実行時間を計測するために使われ、 パフォーマンスのボトルネックがどこにあるかを見つけ出します。
パフォーマンスプロファイリングを使うには、どのコードブロックが計測されるのかを指定する必要があります。 以下のメソッドを、ブロックの最初と最後に挿入することで印をつけます。
Yii::beginProfile('blockID');
...計測対象のコードブロック...
Yii::endProfile('blockID');
blockID
はコードブロックの一意なIDです
コードブロックは適切にネスとする必要があることに注意してください。 すなわち、コードブロックを交差させることはできません。 二つのコードブロックは並列になっているか、一方が片方を完全に含んでいなければなりません。
プロファイルの結果を表示するには、CLogRouterアプリケーションコンポーネントをインストールする必要があります。 これは通常のメッセージルーティングのときと同じです。 CProfileLogRouteルートが計測結果を現在のページの末尾に表示します。
Signup or Login in order to comment.