PR

CakePHP1.2 ログとデバッグ

ログ機能は標準で提供されているようだ。ただ、この機能に満足できない場合やログローテーションなど踏み込んだ機能を必要とする場合はカスタマイズが必要のようだ。しかしソースを変更することなくそういった変更を取り込めることは便利だと思う。

概要

  • $this->log(メッセージ)
    → メッセージは文字列でも配列でもよい。
    配列の場合は print_r されたものが出力される。
    → app/tmp/logs/error.log(デフォルト)
  • $this->log(メッセージ, タイプ)
    → LOG_ERROR(デフォルト)もしくはLOG_DEBUGが指定できる
    → LOG_DEBUGを指定したなら、app/tmp/logs/debug.log にログが出力される
  • ログファイルが存在しない場合はファイルを作成してくれる。
  • app/tmp ディレクトリに書き込み権限を持つ必要がある。
  • log メソッドは Object クラスにあるため、全てのクラスで継承され、コントローラ、モデル、ビューどこからでも利用できる。

スポンサードリンク

使用例1(マニュアルより)

$this->log(“Something didn’t work!”);

// app/tmp/logs/error.log に、次のように追加される
2007-11-02 10:22:02 Error: Something didn’t work!

使用例2(マニュアルより)

// CakePHP のクラス中で log 関数を実行する
$this->log(‘A debugging message.’, LOG_DEBUG);

// error.log ではなく app/tmp/logs/debug.log に、次のように追加される
2007-11-02 10:22:02 Error: A debugging message.

応用例1(引用)

Re: print_r() をログに記録してデバッグ

cake/libs/cake_log.php を app/vendors/ にでもコピーし、app_controller.php などで vendor(‘cake_log’) します。
コピーした cake_log.php の function write() 内の次の部分を

<?php
$filename = LOGS . $type . ‘.log’;
?>

このように

<?php
$filename = LOGS . date(‘ymd’)  . ‘_’ . $type . ‘.log’;
?>

すると便利です。

CakeLogクラスはログ出力時に cake/basics.php の LogError()内でクラスが未定義な場合のみインクルードされるので、事前に用意しておくと出力の仕方にオリジナリティが持たせられます。

ダンプ

debug($fcar);

Debugger::dump($car);

参考文献

参考文献(主にデバッグ)

コメント

  1. ゲストユーザ より:

    為になるサンプルありがとうございます。 応用例1を試してみたのですが、下記のようにクラスの2重定義のエラーが出てしまいます。

     Fatal error: Cannot redeclare class CakeLog in APP/vendors/cake_log.php on line 57 

    また、CakePHP1.2では

     vendor('cake_log'); 

    は使えずエラーになるので、

     App::import( 'Vendor' , 'cake_log' ); 

    を利用しなくて良いのでしょうか?
     
    この辺りは応用例1の通りやっていませんので、もしかしたらこの辺りが原因かもしません。 アドバイスをいただけないでしょうかm(__;m