Subversion Repositories Applications.framework

Rev

Rev 122 | Rev 129 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
//declare(encoding='UTF-8');
/**
* PHP Version 5
*
* @category  PHP
* @package   framework
* @author       aurelien <aurelien@tela-botanica.org>
* @copyright 2009 Tela-Botanica
* @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @version   SVN: <svn_id>
* @link   /doc/framework/
*/

class Log {

        /**
         * Tableau associatif stockant les descripteurs de fichiers
         */
        private static $fichiersLog = array();

        /**
         * Chemin de base du dossier log de l'application
         */
        private static $cheminLogs = '';

        /**
         * Booleen indiquant si l'on peut correctement écrire dans les fichiers de logs
         */
         private static $droitLogger = true;

        /**
         * Zone horaire (pour éviter des avertissements dans les dates)
         */
        private static $timeZone = '';

        /**
         * séparateur de chemin
         */
        private static $sd = DIRECTORY_SEPARATOR;

        /**
         * La classe registre se contient elle-même, (pour le pattern singleton)
         */
        private static $log;

        /**
         * Constructeur par défaut, privé, car on accède à la classe par le getInstance
         */
        private function __construct() {
           self::$sd = Config::get('ds');
           self::$cheminLogs = Config::get('chemin_logs');
           self::$timeZone = Config::get('fw_timezone');

           // gestion de la timezone pour éviter des erreurs
           if(function_exists("date_default_timezone_set") and function_exists("date_default_timezone_get")) {
                   date_default_timezone_set(self::$timeZone);
           }
        }

        /**
         * Fonction qui renvoie l'instance de classe en assurant son unicité, c'est l'unique méthode qui doit être
         * utilisée pour récupérer l'objet Registre
         */
        public static function getInstance() {
                if (self::$log instanceof Log) {
                        return self::$log;
                }
                self::$log = new Log();
                return self::$log;
        }

        /**
         * Ajoute une entrée au log spécifié par le paramètre $nomFichier
         * @param string $nomFichier le nom du fichier dans lequel écrire
         */
        public static function ajouterEntree($nomFichier,$entree,$mode='a+') {
                if(self::$droitLogger) {
                        $date = "\n"."\n".date('d m Y H:i')."\n" ;

                        // si le fichier est déjà dans le tableau et qu'on peut y écrire
                        if(in_array($nomFichier,self::$fichiersLog)) {
                                if(is_writable(self::$cheminLogs.$nomFichier)) {
                                   fwrite(self::$fichiersLog[$nomFichier],$date.$entree);
                                } else {
                                        self::desactiverEcriture($nomFichier);
                                }
                        } else {
                                $fp = fopen(self::$cheminLogs.$nomFichier,$mode);
                                if($fp) {
                                        if(is_writable(self::$cheminLogs.$nomFichier)) {
                                           self::$fichiersLog[$nomFichier] = $fp;
                                                fwrite(self::$fichiersLog[$nomFichier],$date.$entree);
                                        } else {
                                                self::desactiverEcriture($nomFichier);
                                        }
                                } else {
                                        self::desactiverEcriture($nomFichier);
                                }
                        }
                }
        }

        /**
         * Vide un fichier log indiqué
         * @param string $nomFichier le nom du fichier à vider
         */
        public static function viderLog($nomFichier) {
                if(self::verifierPresenceFichier($nomFichier)) {
                        ajouterEntree($nomFichier,'','w');
                }
        }

        /**
         * Vérifie la présence d'un fichier dans le tableau (et bientot plein
         * d'autres choses).
         * @param string $nomFichier le nom du fichier dont on doit vérifier la présence
         * @return boolean vrai si le fichier est dans le tableau, faux sinon
         */
        public static function verifierPresenceFichier($nomFichier) {
                if(in_array($nomFichier,self::$fichiersLog)) {
                        return true;
                }
                return false;
        }

        /**
         * Désactive l'écriture du log et envoie un message au gestionnaire d'erreurs
         * @param string $nomFichier le nom du fichier qui a causé l'erreur
         */
        private static function desactiverEcriture($nomFichier) {
                self::$droitLogger = false;
                $message = 'Ecriture impossible dans le fichier '.$nomFichier.', Assurez-vous des droits du dossier de logs et du fichier';
                $e = new ErrorException($message,0,E_USER_WARNING,__FILE__,__LINE__);
                GestionnaireException::gererException($e);
        }

        /**
         * destructeur de classe, ferme les descripteurs ouverts
         */
        public function __destruct() {
                foreach(self::$fichiersLog as $nomFichier => $fp) {
                        fclose($fp);
                }
        }
}
?>