読者です 読者をやめる 読者になる 読者になる

CakePHPのログシステムを理解する

CakePHP2

Cakeのログまわりはあまり使ってなかったので、調べてまとめてみました。
CakePHP 2.0のコードを元に書いていますが、1.3とか2.1とかでもだいたい同じみたいです。

ログシステムの構成

  • CakeLog
  • CakeLogInterface

の二つのクラスで構成されています。
「CakeLogInterface」は長いし意味が分かりにくいので、以降は「LogEngine」と呼ぶことにします。

基本的なログ出力方法

  1. Object::log($msg, $type)
  2. CakeLog::write($type, $message)

どちらかを使います。
Object::log()はCakeLog::write()を呼び出しているだけなので、どちらでもいいと思います。

<?php
// Object::log()
$this->log('message', 'debug');

// CakeLog::write()
CakeLog::write('debug', 'message');

ログ出力の流れ

  1. Object::log($msg, $type)
  2. CakeLog::write($type, $message)
  3. CakeLogInterface::write($type, $message)

の流れで処理が進みます。

LogEngine

CakeLogはLogEngineに処理を委譲するのみで、実際のログ出力は各LogEngineが行います。
LogEngineは、CakeLogから受け取ったログメッセージとログタイプをもとに、どこにどういうログを出力するかを判断し実行します。

デフォルトでは、ログメッセージをファイルに出力するFileLogが用意されています。

type ≠ level

CakePHPのログシステムは、ログの出力レベルについては関知しません。
ログ出力のメソッドの引数で"debug"とか"error"とかを渡せるので、デバッグレベルと連動してログ出力レベルを切り替えてくれそうな気がしますが、あくまでもただの分類(type)なのでとくになにもしてくれません。
ログを出力するかどうかの判断は基本的にはユーザーにゆだねられているみたいです。

複数のLogEngineを設定できることの意味

CakeLogにはLogEngineを複数設定できます。
しかし、CakeLogは設定されているすべてのLogEngineに対して等しくログ出力を委譲するので、特定のログタイプだけ特定のLogEngineで出力する、というような機能は、CakePHPのログシステムにはありません。
呼び出し側でも、ログ出力時にLogEngineを指定することはできません。

CakeLogとLogEngineの関係は、イベントディスパッチャーとイベントリスナーのような雰囲気になっています。

まとめ

  • CakePHPのログシステムはCakeLogとLogEngineで構成される
  • ログタイプはログレベルではない
  • LogEngineはイベントリスナーみたいな雰囲気

感想

CakePHPのログシステムはわりと簡素な作りで、デフォルトではメッセージをログファイルに書き出すだけです。
でもLogEngineでそれなりに自由に拡張できるので、もの足りないときは自分でLogEngineつくるのがいいのかなーという感じです。

なにか間違ってたり足りないことがありましたらツッコミよろしくお願いします!