[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と同様になってしまうから。

masa