[FuelPHP] 別のディレクトリにログファイルを出力する
FuelPHPで、エラーログや、統計分析用のログを別のディレクトリに保存したいときのメモ
通常、FuelPHPでは、app/logsディレクトリに
YYYY/mm/dd.php
という形式でログが保存される。
結論から言うと、
\Logクラスを継承したクラスを作りそれを利用する
<?php
class My_Log extends \Log{
public static function initialize()
{
// load the file config
\Config::load('file', true);
$log_path = \Config::get('log_path');
\Config::set('log_path', APPPATH."mylogs".DS);
parent::initialize();
\Config::set('log_path', $log_path);
}
?>
自作したMy_Logクラスは、
app/classes/my/log.php
という名前で保存。
ログは
app/mylogs/YYYY/mm/dd.php
という名前で出力される。
使い方は\Logと同じように使える
\My_Log::info( 'test' );
いちいち継承したクラスを作らないといけないのは、
簡単に言うと、\Logクラスが持つファイル操作のインスタンスを
staticで持っている為、あとから変更できない。
例えば、
\Log::info(1); \Config::set('log_path',APPPATH.'mylogs'.DS); \Log::info(2);
と書いても、
\Log::info(2);
は、app/logs/にログファイルを出力する
1行目の
\Log::info(1);
の時点で、設定ファイルに書かれたlog_pathのパスが
静的に保持されているので、
\Config::set('log_path',APPPATH.'mylogs'.DS);
2行目でいくら設定ファイルの値を変えても、\Logクラスはもう設定ファイルを見てない。
さらに
$log_path = \Config::get('log_path'); \Config::set('log_path', APPPATH."mylogs".DS); parent::initialize(); \Config::set('log_path', $log_path);
いちいち設定ファイルのlog_pathの値を変数に入れておき
後から戻す理由は
\My_Log→\Logの順番で処理を書いたとき、
設定ファイルのlog_pathを変更してしまっていたら
\Logの出力先も、\My_Logと同様になってしまうから。