Zend_Log pseudo logrotate

Manchmal wachsen einem die Logfiles ja über den Kopf und drohen den Server zu sprengen.
Dann muss man aufräumen, weithin als logrotation bekannt. Unter Linux gibt es ja das praktische logrotate Programm, welches man für seine zwecke vielfältig konfigurieren kann.

Es gibt dann aber auch Fälle wo man dies nicht benutzen will/kann, zB weil man auf shared hosting ist oder man eine Tool ausliefern will, welches selbst aufräumen soll.

Zend_Log bietet zZt leider keine Log Rotation mit an, also muss man es selber machen:

In meinem Fall will ich die Logfiles ca eine Woche vorhalten, das sollte reichen um Problemen auf die Spur zu kommen.
Zudem werde ich die tagesweise stückeln, da diese in einem Backend angezeigt werden sollen.
Dafür nenne ich die Logfiles so:

define('SYNC_LOG','sync.'.date('N').'.log.txt');

Also mit numerischem Wochentag im Namen.

Die Pseudo Logrotation bedeutet in meinem Fall, alle LogFiles, die älter als die Woche sind, werden neu geschrieben, also der Inhalt nicht angehangen.

Dazu wird die Zend_Log_Writer Klasse extendet:

class MyZend_Log_Rotated_File extends Zend_Log_Writer_Stream{
	function __construct($file) {
		parent::__construct($file,self::rotator($file));
	}
	static function rotator($file) {
		$mode = 'w+';
		if (file_exists($file)) {
			$ft = filemtime($file);
			$yt = mktime(0, 0, 0, date('m'), date('d')-1, date('Y'));
			if($ft > $yt){
				$mode = 'a';
			}
		}
		return $mode;
	}
}

Jetzt wird bei jeder Instanzierung geprüft ob der File zu alt ist und der Öffne-Modus dementsprechend gesetzt und der Parent Klasse, also dem Zend_Log_Writer übergeben.

So wird es dann aufgerufen:

$logger = new Zend_Log();
$writer = new MyZend_Log_Rotated_File(LOGDIR.SYNC_LOG);
$logger->addWriter($writer);
$logger->log('log was!');

One Reply to “Zend_Log pseudo logrotate”

Comments are closed.