PHP Classes

File: logger.class.php

Recommend this page to a friend!
  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: 11 years 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->threshold* 1024;
   
$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');
}