2017年02月01日

FuelPHPで日またぎ時にログファイルの切り替えをする

FuelPHPのtasks(バッチ)などを常駐させたり、処理に時間がかかって日をまたいた時など、ログファイルを切り替えたい時があったのでちょっと調べてみました。
ていうか、FuelPHPは処理が終わるまでログファイル切り替えてくれないんで困っていたんです!

coreのLogクラス ( fuel/core/classes/log.php) のソース追っかけてくとこんな感じで書き出しているみたい(FuelPHP1.7の場合)。
		// log the message
		static::instance()->log($level, (empty($method) ? '' : $method.' - ').$msg);

		return true;
	}
さらに、instance()を追ってくと、
	/**
	 * Return the monolog instance
	 */
	public static function instance()
	{
		// make sure we have an instance
		static::$monolog or static::_init();

		// return the created instance
		return static::$monolog;
	}
こんな感じになってました。
うーん、シングルトンパターンかー。なるほど。
ログファイル名の設定はインスタンス作成時にしかやってないので、これだとログの日付は終了するまで変わらんですなー。
とはいえcoreにあまり手を入れたくないし動作確認などの影響もあるので、インスタンスを破棄すれば再度初期化処理が走るからいいんじゃないかなー、くらいで考えておりました。
んじゃどうやって破棄すりゃいいのかな、と調べてましたらこんなページを見つけました。

基底クラスのstaticメンバ変数を継承先のクラスで書き換えると、別クラスのインスタンスにも影響する

なるほど。継承先のクラスから基底クラスのメンバ変数を変更できるんですな。
つまり、coreのLogクラスを継承してインスタンスを破棄するメソッドを作成して、日をまたいだらこのメソッドを呼んであげればいいんですな。
<?php

class myLog extends Fuel\Core\Log {

	/*
	** 日付またぎ用メソッド
	** Logクラスのインスタンスを破棄して新たに作成させる
	*/
	public static function nextday() {

		self::$monolog = null;
	}
}
こんな感じで一応ちゃんとログが切り替わります。
このあたりの日またぎ時のログの情報がググってもぜんぜん出てこないのなんで…?
みんな困ってないの…?
タグ:PHP
posted by まちゅ at 14:30| Comment(0) | プログラミング