Login   Register  
PHP Classes
elePHPant
Icontem

File: logger.class.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Daniele Cruciani  >  PHP Log With Rotatation  >  logger.class.php  >  Download  
File: logger.class.php
Role: Class source
Content type: text/plain
Description: the class file
Class: PHP Log With Rotatation
Rotate log files that exceed a given size limit
Author: By
Last change: removed $testing
Date: 8 months ago
Size: 3,295 bytes
 

Contents

Class file image Download
<?php

date_default_timezone_set
('Europe/Rome');

define('DEFAULT_LOGFILE','logfile.txt');

class 
Logger
{
  private 
$base_path;
  private 
$basename;
  private 
$filename;
  private 
$threshold 1024;
  private 
$size TRUE;

  private 
$first_run TRUE;

  private 
$rotateET FALSE;
  private 
$no_rotation FALSE;

  function 
__construct()
  {
    
$this->base_path dirname(__FILE__);
    
$this->basename DEFAULT_LOGFILE;
    
$this->threshold 1024;
  }

  
/**
   * runned the first time
   */
  
private function firstRun()
  {
    
$this->filename $this->base_path DIRECTORY_SEPARATOR $this->basename;
    
$this->rotate_log();
    
$this->flog fopen($this->filename,'a+');
    
$this->first_run false;
  }

  
/**
   * set the filename
   */
  
function setFilename($filename)
  {
    
$this->basename $filename;
  }

  
/**
   * set base path (base dir)
   */
  
function setBasepath($basepath)
  {
    
$this->base_path $basepath;
  }
  
  
/**
   * set threshold for rotation, in term of number of KBytes
   * defaults to 1024 (1 MByte)
   */
  
function setThreshold($threshold) {
    
$this->threshold $threshold;
  }

  
/**
   * set ratate every time: every time log function is called rotate is called
   */
  
function setRotateEveryTime($rotateET)
  {
    
$this->rotateET $rotateET;
  }

  
/**
   * use this to disable log file name rotation ( $logger->setNoRotation(TRUE) means no rotation of file log)
   */
  
function setNoRotation($rotation)
  {
    
$this->no_rotation = ($rotation?FALSE:TRUE);
  }

  
/**
   * rotate log $filename adding .x to end of filename
   * use this to force rotate
   */
  
public function rotate_log()
  {
    if(
$this->no_rotation) return;
    
$threshold_bytes $this->threshold1024;
    
$filename $this->filename;
    if( 
file_exists($this->filename) && filesize($filename) >= $threshold_bytes ) {
      
// rotate
      
$path_info pathinfo($filename);
      
$base_directory $path_info['dirname'];
      
$base_name $path_info['basename'];
      
$num_map = array();
      foreach( new 
DirectoryIterator($base_directory) as $fInfo) {
    if(
$fInfo->isDot() || ! $fInfo->isFile()) continue;
    if (
preg_match('/^'.$base_name.'\.?([0-9]*)$/',$fInfo->getFilename(), $matches) ) {
      
$num $matches[1];
      
$file2move $fInfo->getFilename();
      if (
$num == ''$num = -1;
      
$num_map[$num] = $file2move;
    }
      }
      
krsort($num_map);
      foreach(
$num_map as $num => $file2move) {
    
$targetN $num+1;
    
rename($base_directory.DIRECTORY_SEPARATOR.$file2move,$filename.'.'.$targetN);
      }
    }
  }

  
/**
   * write log line.
   * that is:
   * [date] PID: [[PID]] $text\n
   * where
   * [date] is date('Ymd H:i:s')
   * [PID] is getmypid() (i.e. [[PID]] would be [3123] string)
   */
  
function log($text)
  {
    if(
$this->first_run$this->firstRun();
    
fwrite($this->flog,date('Ymd H:i:s')." PID: [".getmypid()."] ".$text."\n");
  }

  
/**
   * destructor ensure file close, use
   * unset $logger;
   * that is.
   */
  
function __destruct()
  {
    
fclose($this->flog);
  }

}

//$testing = true;
if(isset($testing)) {
  
$logger = new Logger();

  
$logger->log('a strange message');
}