Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CLASS DE LOG PHP5


Information sur la source

Catégorie :Class et Objet ( POO ) Classé sous : php5, log, fichier, abstrait, classe Niveau : Initié Date de création : 04/12/2007 Date de mise à jour : 04/12/2007 23:20:17 Vu / téléchargé: 2 545 / 113

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

Bonjour tous le monde,
Voila j'ai créé une classe permettant de gérer les logs avec plusieurs sorties possibles. Pour l'instant j'ai créé que la sortie vers un fichier mais on peut facilement y rajouter d'autre type de sortie (xml, bdd etc...)
Je me suis inspiré de plusieurs framework et source (notement celle de malalam et fhx) que j'ai mis a ma sauce.
J'attend vaut retour afin de l'améliorer.

 

Source

  • <?php
  • class LogsFactory
  • {
  • private $options = array('EXCEPTION_ON_ERREUR' => true,
  • 'EXCEPTION_ON_FILE' => false);
  • public static function selectLogs($type, $param)
  • {
  • switch($type)
  • {
  • case 'file':
  • $log = System::getModule('LogsToFile', $param);
  • break;
  • case 'xml':
  • $log = System::getModule('LogsToXml', $param);
  • break;
  • case 'bdd':
  • $log = System::getModule('LogsToBdd', $param);
  • break;
  • default:
  • ExceptionFactory::catchException(ExceptionLogs::ERR_MESS_TYPE,
  • ExceptionLogs::ERR_CODE_TYPE,
  • __CLASS__, __FUNCTION__, $this->options);
  • break;
  • }
  • return $log;
  • }
  • }
  • ?>
  • <?php
  • abstract class Logs
  • {
  • private $options = array('EXCEPTION_ON_ERREUR' => true,
  • 'EXCEPTION_ON_FILE' => false);
  • protected $contenuLog = array('NAME_LEVEL' => '',
  • 'NUM_LEVEL' => '',
  • 'DATE_LOG' => '',
  • 'MESSAGE' => '');
  • protected $formatage;
  • protected $ressource;
  • public function open()
  • {
  • if( false === ($this->ressource = $this->_open()) )
  • {
  • ExceptionFactory::catchException(ExceptionLogs::ERR_MESS_OPEN,
  • ExceptionLogs::ERR_CODE_OPEN,
  • __CLASS__, __FUNCTION__, $this->options);
  • return false;
  • }
  • return true;
  • }
  • public function write()
  • {
  • if( false === $this->_write($this->formatLog()) )
  • {
  • ExceptionFactory::catchException(ExceptionLogs::ERR_MESS_WRITE,
  • ExceptionLogs::ERR_CODE_WRITE,
  • __CLASS__, __FUNCTION__, $this->options);
  • return false;
  • }
  • return true;
  • }
  • public function read()
  • {
  • if( false === $this->_read() )
  • {
  • ExceptionFactory::catchException(ExceptionLogs::ERR_MESS_READ,
  • ExceptionLogs::ERR_CODE_READ,
  • __CLASS__, __FUNCTION__, $this->options);
  • return false;
  • }
  • return true;
  • }
  • protected function getLevel($lvl)
  • {
  • $level = System::getModule('LogsLevel');
  • $level = $level->getErrorLevel($lvl);
  • return $level;
  • }
  • private function formatLog()
  • {
  • return $this->formatage->replaceFormat($this->contenuLog);
  • }
  • abstract public function _open();
  • abstract public function _write($contenu);
  • abstract public function _read();
  • }
  • ?>
  • <?php
  • class LogsToFile extends Logs
  • {
  • private $url;
  • public function __construct($param)
  • {
  • if( is_resource($param['RESSOURCE']) )
  • {
  • if ( get_resource_type($param['RESSOURCE']) != 'stream' )
  • {
  • ExceptionFactory::catchException(ExceptionLogs::ERR_MESS_RESSOURCE,
  • ExceptionLogs::ERR_CODE_RESSOURCE,
  • __CLASS__, __FUNCTION__, $this->options);
  • }
  • $this->ressource = $param['RESSOURCE'];
  • }
  • else
  • {
  • $this->url = $param['RESSOURCE'];
  • $this->open();
  • }
  • $this->formatage = System::getModule('FormatText');
  • $this->contenuLog['NAME_LEVEL'] = $this->getLevel($param['LEVEL']);
  • $this->contenuLog['NUM_LEVEL'] = $param['LEVEL'];
  • $this->contenuLog['DATE_LOG'] = date("d-m-Y H:i:s");
  • $this->contenuLog['MESSAGE'] = $param['MESSAGE'];
  • }
  • public function _open()
  • {
  • return @fopen($this->url, 'a+');
  • }
  • public function _write($contenu)
  • {
  • return @fwrite($this->ressource, $contenu);
  • }
  • public function _read()
  • {
  • if( filesize($this->url) != 0 )
  • {
  • return @fread($this->ressource, filesize($this->url));
  • }
  • else
  • {
  • return NULL;
  • }
  • }
  • public function close()
  • {
  • if( is_resource($this->ressource) )
  • {
  • @fclose($this->ressource);
  • }
  • }
  • }
  • ?>
  • <?php
  • class LogsLevel
  • {
  • private $options = array('EXCEPTION_ON_ERREUR' => true,
  • 'EXCEPTION_ON_FILE' => false);
  • private $errorLevel = array('0' => 'GOOD',
  • '1' => 'WARNING',
  • '2' => 'ERROR',
  • '3' => 'FATAL_ERROR');
  • public function getErrorLevel($numLevel)
  • {
  • if( $numLevel < 0 && $numLevel > 3 )
  • {
  • ExceptionFactory::catchException(ExceptionLogs::ERR_MESS_LEVEL,
  • ExceptionLogs::ERR_CODE_LEVEL,
  • __CLASS__, __FUNCTION__, $this->options);
  • }
  • if(! is_integer($numLevel) )
  • {
  • ExceptionFactory::catchException(ExceptionLogs::ERR_MESS_INTEGER,
  • ExceptionLogs::ERR_CODE_INTEGER,
  • __CLASS__, __FUNCTION__, $this->options);
  • }
  • return $this->errorLevel[$numLevel];
  • }
  • }
  • ?>
  • <?php
  • class FormatText
  • {
  • private $formatage;
  • public function __construct()
  • {
  • $format = "{NAME_LEVEL} ({NUM_LEVEL}) : {DATE_LOG} : {MESSAGE}\n";
  • $this->formatage = $format;
  • }
  • public function replaceFormat($log)
  • {
  • $out = $this->formatage;
  • foreach ($log as $name => $value)
  • {
  • $out = str_replace('{'.$name.'}', $value, $out);
  • }
  • return $out;
  • }
  • }
  • ?>
  • ***************** Uitlisation ********************
  • <?php
  • require_once('./ressources/autoload.php');
  • try
  • {
  • $param = array('RESSOURCE' => './test.txt',
  • 'LEVEL' => 1,
  • 'MESSAGE' => 'Erreur test test test 2');
  • $log = LogsFactory::selectLogs('file', $param);
  • $log->write();
  • }
  • catch(Exception $error)
  • {
  • die($error->getMessage());
  • }
  • catch(ExceptionLogs $error)
  • {
  • die($error->myGetMessage());
  • }
  • ?>
<?php

class LogsFactory
{
	private $options	= array('EXCEPTION_ON_ERREUR' 	=> true, 
					'EXCEPTION_ON_FILE' 	=> false);
	
	public static function selectLogs($type, $param)
	{
		switch($type)
		{
			case 'file':
				$log 	= System::getModule('LogsToFile', $param);
				break;
			case 'xml':
				$log 	= System::getModule('LogsToXml', $param);
				break;
			case 'bdd':
				$log 	= System::getModule('LogsToBdd', $param);
				break;
			default:
				ExceptionFactory::catchException(ExceptionLogs::ERR_MESS_TYPE, 
						     ExceptionLogs::ERR_CODE_TYPE, 
						     __CLASS__, __FUNCTION__, $this->options);
				break;
		}
		
		return $log;
	}
}

?>

<?php
abstract class Logs
{
	private $options = array('EXCEPTION_ON_ERREUR' 	=> true, 
				 'EXCEPTION_ON_FILE' 	=> false);
	
	protected $contenuLog	= array('NAME_LEVEL'	=> '',
					'NUM_LEVEL'	=> '',
					'DATE_LOG'	=> '',
					'MESSAGE'	=> '');
	
	protected $formatage;
	protected $ressource;
	
	public function open()
	{
		if( false === ($this->ressource = $this->_open()) )
		{
			ExceptionFactory::catchException(ExceptionLogs::ERR_MESS_OPEN, 
						         ExceptionLogs::ERR_CODE_OPEN, 
							 __CLASS__, __FUNCTION__, $this->options);
											 
			return false;
		}
		
		return true;
	}
	
	public function write()
	{
		if( false === $this->_write($this->formatLog()) )
		{
			ExceptionFactory::catchException(ExceptionLogs::ERR_MESS_WRITE, 
							 ExceptionLogs::ERR_CODE_WRITE, 
							 __CLASS__, __FUNCTION__, $this->options);
											 
			return false;
		}
		
		return true;
	}
	
	public function read()
	{
		if( false === $this->_read() )
		{
			ExceptionFactory::catchException(ExceptionLogs::ERR_MESS_READ, 
							 ExceptionLogs::ERR_CODE_READ, 
							__CLASS__, __FUNCTION__, $this->options);
						
			return false;
		}
		
		return true;
	}
	
	protected function getLevel($lvl)
	{
		$level = System::getModule('LogsLevel');
		$level = $level->getErrorLevel($lvl);
		
		return $level;
	}
	
	private function formatLog()
	{
		return $this->formatage->replaceFormat($this->contenuLog);
	}
	
	abstract public function _open();
	abstract public function _write($contenu);
	abstract public function _read();
}
?>

<?php
class LogsToFile extends Logs
{
	private $url;
	
	public function __construct($param)
	{
		if( is_resource($param['RESSOURCE']) )
		{
			if ( get_resource_type($param['RESSOURCE']) != 'stream' ) 
			{
                             ExceptionFactory::catchException(ExceptionLogs::ERR_MESS_RESSOURCE, 
							 ExceptionLogs::ERR_CODE_RESSOURCE, 
							 __CLASS__, __FUNCTION__, $this->options);
                        }
             
                        $this->ressource = $param['RESSOURCE'];
		}
		else
		{
			$this->url 	= $param['RESSOURCE'];
			$this->open();
		}
		
		$this->formatage			= System::getModule('FormatText');
		$this->contenuLog['NAME_LEVEL'] 	= $this->getLevel($param['LEVEL']);
		$this->contenuLog['NUM_LEVEL']		= $param['LEVEL'];
		$this->contenuLog['DATE_LOG']		= date("d-m-Y H:i:s");
		$this->contenuLog['MESSAGE']		= $param['MESSAGE'];
	}
	
	public function _open()
	{
		return @fopen($this->url, 'a+');
	}
	
	public function _write($contenu)
	{		
		return @fwrite($this->ressource, $contenu);
	}
	
	public function _read()
	{
		if( filesize($this->url) != 0 )
		{
			return @fread($this->ressource, filesize($this->url));
		}
		else
		{
			return NULL;
		}
	}
	
	public function close()
	{
		if( is_resource($this->ressource) )
		{
			@fclose($this->ressource);
		}
	}
}
?>

<?php
class LogsLevel
{
	private $options	= array('EXCEPTION_ON_ERREUR' 	=> true, 
					'EXCEPTION_ON_FILE' 	=> false);
	
	private $errorLevel	= array('0' => 'GOOD',
					'1' => 'WARNING', 
					'2' => 'ERROR', 
					'3' => 'FATAL_ERROR');
	
	public function getErrorLevel($numLevel)
	{
		if( $numLevel < 0 && $numLevel > 3 )
		{
			ExceptionFactory::catchException(ExceptionLogs::ERR_MESS_LEVEL, 
							 ExceptionLogs::ERR_CODE_LEVEL, 
							 __CLASS__, __FUNCTION__, $this->options);
		}
		
		if(! is_integer($numLevel) )
		{
			ExceptionFactory::catchException(ExceptionLogs::ERR_MESS_INTEGER, 
					                 ExceptionLogs::ERR_CODE_INTEGER, 
							 __CLASS__, __FUNCTION__, $this->options);
		}
		
		return $this->errorLevel[$numLevel];
	}
}
?>

<?php
class FormatText
{
	private $formatage;

    public function __construct()
    {
        $format = "{NAME_LEVEL} ({NUM_LEVEL}) : {DATE_LOG} : {MESSAGE}\n";
        $this->formatage = $format;
    }
    
    public function replaceFormat($log)
    {
    	$out = $this->formatage;
    	
        foreach ($log as $name => $value) 
        {
            $out = str_replace('{'.$name.'}', $value, $out);
        }
        
        return $out;
    }
}
?>

***************** Uitlisation ********************
<?php
require_once('./ressources/autoload.php');

try
{
	$param 	= array('RESSOURCE' => './test.txt',
					'LEVEL'		=> 1, 
					'MESSAGE'	=> 'Erreur test test test 2');
	
	$log = LogsFactory::selectLogs('file', $param);
	$log->write();
}
catch(Exception $error)
{
	die($error->getMessage());
}
catch(ExceptionLogs $error)
{
	die($error->myGetMessage());
}
?>

Conclusion

N'hesitez pas a donner votre avis
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

04 décembre 2007 17:14:18 :
maj
04 décembre 2007 17:47:32 :
MAJ
04 décembre 2007 19:41:16 :
MAJ : ajout d'une class factory
04 décembre 2007 19:42:32 :
MAJ : mise a jour du zip
04 décembre 2007 23:20:17 :
MAJ : rajout <?php ?>

Commentaires et avis

signaler à un administrateur
Commentaire de malalam le 04/12/2007 22:20:25 administrateur CS

Hello,

je suis nommé dans le descriptif, alors que puis-je dire... ;-)
Nan, sérieusement, c'est très correctement codé.
Ca mérite que j'approfondisse en testant le code. J'ai pas franchement le temps, là, mais je tâcherai de le faire (sans garntie hein).
Juste : j'aurais lancé des exceptions moi, en testant les fonctions dont tu masques les erreurs avec un @. Mais j'ai juste parcouru le code donc je ne m'avance pas trop, si ça se trouve t'as une gestion d'erreur externe. Si ce n'est pas le cas : gère ces erreurs. Un fopen() qui échoue a généralement de grosses conséquences.
Bien en tous cas, très bonne qualité de code :-) Et sujet intéressant (logger, bordel, c'est vraiment vital quand on développe des applicatifs web!!)

signaler à un administrateur
Commentaire de malalam le 04/12/2007 22:20:47 administrateur CS 9/10

j'ai oublié de noter...

signaler à un administrateur
Commentaire de codefalse le 04/12/2007 22:52:02 administrateur CS

Par contre si tu pouvais mettre des <?php / ?> pour que ton code soit colorié, ce serait nickel :)

signaler à un administrateur
Commentaire de dorian91 le 04/12/2007 23:26:02

Voila j'ai rajouté les <?php ?>
Pour les exceptions elles sont géré dans une class externe
ExceptionFactory et ExceptionLog fournies avec le zip.
Ex du fopen

if( false === ($this->ressource = $this->_open()) )
{
      ExceptionFactory::catchException(ExceptionLogs::ERR_MESS_OPEN,
       ExceptionLogs::ERR_CODE_OPEN,
       __CLASS__, __FUNCTION__, $this->options);

      return false;
}

signaler à un administrateur
Commentaire de dorian91 le 04/12/2007 23:32:06

J'ai oublié de dire ^^ merci pour vos commentaires

signaler à un administrateur
Commentaire de malalam le 04/12/2007 23:48:29 administrateur CS

Je parlais de ça moi :
#  public function _open()
# {
# return @fopen($this->url, 'a+');
# }
#
# public function _write($contenu)
# {
# return @fwrite($this->ressource, $contenu);
# }

signaler à un administrateur
Commentaire de coucou747 le 05/12/2007 02:26:57

ca a l'air bien code, j'ai juste une idee : ajouter un wrapper dessus pour pouvoir faire un truc genre :
file_put_contents('log://section_site/warning', 'erreur bizare survenur suite a une surchauffe du disjoncteur du generateur d\'espace temps');

signaler à un administrateur
Commentaire de dorian91 le 05/12/2007 19:21:15

Euh je veux bien essayer, mais c'est quoi un wrapper? comment en faire un?

signaler à un administrateur
Commentaire de coucou747 le 05/12/2007 19:34:57

http://fr.php.net/manual/fr/function.stream-wrapper-register.php

signaler à un administrateur
Commentaire de dorian91 le 05/12/2007 21:22:50

Merci pour la source je vais étudier ca ^^

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

template.inc [ par joedalton ] bonjourVoila, je possede un fichier template.inc qui me permet de définir ma classe template, mais le probleme c'est que ce fichier est valable pour l pb avec ma classe [ par windu ] voila, j'utilise 1 classe de connexion (MySQL), classe que j'appelle dasn mon fichier de connexion à la base. tout va bien il me suffit d'inclure ce f Affichage de graphique [ par nbenoist ] sur RedHat 7.2 J'ai une page php qui lit un fichier de log. Ma page php me affiche 2 camenbert suivant les informations du fichier log. J'ai mis les une classe pour toute la navigation [ par dark_naruto25 ] Salut Je suis en train de faire une classe dans un fichier que j'inclue dans tout les fichier qui en ont besoin. Seulement je veux cr&#233;er une seul extraction de donnee d'un fichier .log [ par Noiprocs77 ] Bonjours a toutes et tous .Voila apres des jours de recherche sur le net , je me decide a poster en esperant qu'on puisse me repondre favorablement .D Problème de portée de variable URGENT [ par Tupac59 ] Voila le problème: depuis la page précédente je POST ['log2'], dans la page suivante je récupère ce log2 dans la variable $log et cela fonctionne puis Verification de fichier [ par godofgames ] Bonjour j'ai une question j'ai un site a realiser pour quelqu'un et cette personne veux pouvoir faire les modification elle meme mais elle ne veux rie un fichier de fonctions ou une classe de fonctions ? [ par mickaelpfr ] Bonjour a tous , dans le cadre du dèveloppement d'un projet , j'ai de nombreuses fonction n'ayant pas de rapport entre elle mais je me demandais s'il Modifier un fichier .log en profondeur [ par Equilibrius ] Bonjour a tous, voilà j'ai un petit problemme, j'ai un fichier .log qui fait plus de 2.5Mo (avec en gros 40'000 lignes) il contien les log de plusieur php - intranet - MysqL [ par ben272 ] Bonsoir à tous, j'ai quelques questions à poser. Voilà dans mon collège on va mettre en place un intranet ( section informatique seulement ),et c'est


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.