• [Zend Framework] Zend_Logでログのローテーション

    前回は簡単な使い方を書きましたが、今回は拡張する人用の情報を書きます。 クラスの構成 こんな感じになっています ┌─────────────------------------─┐ ┌────------------------------──────────-─┐┌─---------------────────┐ │ Wads_Log_RotationFile_Abstract │◇┬→│ Wads_Log_RotationFile_Writer_Interface ││Zend_Log_Writer_Abstract│ └───────-------------------──────┘ │ ├───────------------------------─────────┤└──-------------─────────┘ ▲ │ │ + update() │ ▲ │ │ └─────────────---------------------──────┘ │ ┌────────-----------───┐ │ △ │ │Wads_Log_RotationFile │ │ ├─────────────────────────────────┘ └─-----------──────────┘ │ ┌────────────────────────────┐ │ │Wads_Log_Writer_RotationFile│ │ ├────────────────────────────┤ │ │ + update() │ │ └────────────────────────────┘ │ ┌──────────────────────────────────────┐ └→│Wads_Log_RotationFile_Policy_Abstract │ ├──────────────────────────────────────┤ │ + trigger() │ │ + rollOver() │ └──────────────────────────────────────┘ ▲ ┌────────────────────┴───────────────────┐ ┌──────────────────────────────────────┐┌──────────────────────────────────┐ │Wads_Log_RotationFile_Policy_Datetime ││Wads_Log_RotationFile_Policy_Size │ ├──────────────────────────────────────┤├──────────────────────────────────┤ │ + trigger() ││ + trigger() │ │ + rollOver() ││ + rollOver() │ └──────────────────────────────────────┘└──────────────────────────────────┘ デザインパターンでいうと、ObserverとAdapterパターンあたりを意識しています。 PHPによるデザインパターン入門の本が役に立ちました。コンポーネントは、大きく分けると、
  • [Zend Framework]Zend_Logでログのローテーション

    勉強会で話したZend_Logを拡張してログのローテーションをできるようにしたものです。 log4jやlog4phpを参考にしながら、基本的な機能の部分をZend_Logに合わせて作りました。 前回の記事でも書きましたが、logrotateなどを使用してサーバー側でローテーションできないような場合(junichiroさんがコメントで仰っているようにレンタルサーバーなど)に、使用するといいかもしれません。 ソースはこちら 特徴 特定の期間やログのサイズをもとにローテーションを行うことができる ローテーションの方法を自由に拡張できる Zend_Logを使っていれば、writerを変更するだけで設定ができる 構成 Wads/ Log/ Writer/ RotationFile.php RotationFile/ Writer/ Interface.php Policy/ Abstract.php Datetime.php Size.php RotationFile.php Wads_Log_Writer_RotationFile クラスが、既存のZend_Log_Writer を拡張してローテーションに対応させたものです。これに、Wads_Log_RotationFile というローテーションを行うクラスを設定して使用します。 また、Wads/Log/RotationFile/Policy 以下にあるクラスでどのようにローテーションを行うか決めています。 現在は、ログファイルのサイズでローテーションを行うWads_Log_RotationFile_Policy_Sizeと、日付や時間、曜日でローテーションを行うWads_Log_RotationFile_Policy_Datetime の2つを用意しています。 使用方法 Wads_Log_RotationFileクラスのオブジェクトを生成する 1で生成したオブジェクト指定してWads_Log_Writer_RotationFileのオブジェクトを生成する Wads_Log_Writer_RotationFileのオブジェクトをZend_Logに追加する Zend_Logのlog()関数などを使ってログを書き出す 3以降は通常のZend_Logの使い方と同じです。 使用例です。 // ログファイル名 $logfile = "/var/log/foo/test.log"; // ローテーション方法指定 $opt = array( 'policy' => 'size', // Wads\_Log\_RotationFile\_Policy\_Size使用する 'backupindex' => 3, 'size' => 40 ); // 1(上の■ 使用方法 の番号) $lotation = new Wads\_Log\_Rotation($logfile, $opt); // 2 ('a' は fopen の mode) $writer = new Wads\_Log\_Writer\_RotationFile($logfile, 'a', $lotation); // 3 $log = new Zend\_Log(); $log->addWriter($writer); /\* .