Subversion Repositories Applications.framework

Rev

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

Rev Author Line No. Line
122 aurelien 1
<?php
2
//declare(encoding='UTF-8');
3
/**
4
* PHP Version 5
5
*
6
* @category  PHP
7
* @package   framework
123 aurelien 8
* @author	aurelien <aurelien@tela-botanica.org>
122 aurelien 9
* @copyright 2009 Tela-Botanica
10
* @license   http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
11
* @version   SVN: <svn_id>
123 aurelien 12
* @link	  /doc/framework/
122 aurelien 13
*/
14
 
15
class Log {
16
 
123 aurelien 17
	/**
18
	 * Tableau associatif stockant les descripteurs de fichiers
19
	 */
20
	private static $fichiersLog = array();
122 aurelien 21
 
123 aurelien 22
	/**
23
	 * Chemin de base du dossier log de l'application
24
	 */
25
	private static $cheminLogs = '';
122 aurelien 26
 
123 aurelien 27
	/**
28
	 * Booleen indiquant si l'on peut correctement écrire dans les fichiers de logs
29
	 */
30
	 private static $droitLogger = true;
122 aurelien 31
 
123 aurelien 32
	/**
33
	 * Zone horaire (pour éviter des avertissements dans les dates)
34
	 */
35
	private static $timeZone = '';
122 aurelien 36
 
123 aurelien 37
	/**
38
	 * séparateur de chemin
39
	 */
40
	private static $sd = DIRECTORY_SEPARATOR;
122 aurelien 41
 
123 aurelien 42
	/**
43
	 * La classe registre se contient elle-même, (pour le pattern singleton)
44
	 */
45
	private static $log;
122 aurelien 46
 
123 aurelien 47
	/**
48
	 * Constructeur par défaut, privé, car on accède à la classe par le getInstance
49
	 */
50
	private function __construct() {
51
	   self::$sd = Config::get('ds');
52
	   self::$cheminLogs = Config::get('chemin_logs');
53
	   self::$timeZone = Config::get('fw_timezone');
122 aurelien 54
 
123 aurelien 55
	   // gestion de la timezone pour éviter des erreurs
56
	   if(function_exists("date_default_timezone_set") and function_exists("date_default_timezone_get")) {
57
		   date_default_timezone_set(self::$timeZone);
58
	   }
59
	}
122 aurelien 60
 
123 aurelien 61
	/**
62
	 * Fonction qui renvoie l'instance de classe en assurant son unicité, c'est l'unique méthode qui doit être
63
	 * utilisée pour récupérer l'objet Registre
64
	 */
65
	public static function getInstance() {
66
		if (self::$log instanceof Log) {
67
			return self::$log;
68
		}
69
		self::$log = new Log();
70
		return self::$log;
71
	}
122 aurelien 72
 
123 aurelien 73
	/**
74
	 * Ajoute une entrée au log spécifié par le paramètre $nomFichier
75
	 * @param string $nomFichier le nom du fichier dans lequel écrire
76
	 */
77
	public static function ajouterEntree($nomFichier,$entree,$mode='a+') {
78
		if(self::$droitLogger) {
79
			$date = "\n"."\n".date('d m Y H:i')."\n" ;
122 aurelien 80
 
123 aurelien 81
			// si le fichier est déjà dans le tableau et qu'on peut y écrire
82
			if(in_array($nomFichier,self::$fichiersLog)) {
83
				if(is_writable(self::$cheminLogs.$nomFichier)) {
84
				   fwrite(self::$fichiersLog[$nomFichier],$date.$entree);
85
				} else {
86
					self::desactiverEcriture($nomFichier);
87
				}
88
			} else {
89
				$fp = fopen(self::$cheminLogs.$nomFichier,$mode);
90
				if($fp) {
91
					if(is_writable(self::$cheminLogs.$nomFichier)) {
92
					   self::$fichiersLog[$nomFichier] = $fp;
93
						fwrite(self::$fichiersLog[$nomFichier],$date.$entree);
94
					} else {
95
						self::desactiverEcriture($nomFichier);
96
					}
97
				} else {
98
					self::desactiverEcriture($nomFichier);
99
				}
100
			}
101
		}
102
	}
122 aurelien 103
 
123 aurelien 104
	/**
105
	 * Vide un fichier log indiqué
106
	 * @param string $nomFichier le nom du fichier à vider
107
	 */
108
	public static function viderLog($nomFichier) {
109
		if(self::verifierPresenceFichier($nomFichier)) {
110
			ajouterEntree($nomFichier,'','w');
111
		}
112
	}
122 aurelien 113
 
123 aurelien 114
	/**
115
	 * Vérifie la présence d'un fichier dans le tableau (et bientot plein
116
	 * d'autres choses).
117
	 * @param string $nomFichier le nom du fichier dont on doit vérifier la présence
118
	 * @return boolean vrai si le fichier est dans le tableau, faux sinon
119
	 */
120
	public static function verifierPresenceFichier($nomFichier) {
121
		if(in_array($nomFichier,self::$fichiersLog)) {
122
			return true;
123
		}
124
		return false;
125
	}
122 aurelien 126
 
123 aurelien 127
	/**
128
	 * Désactive l'écriture du log et envoie un message au gestionnaire d'erreurs
129
	 * @param string $nomFichier le nom du fichier qui a causé l'erreur
130
	 */
131
	private static function desactiverEcriture($nomFichier) {
132
		self::$droitLogger = false;
133
		$message = 'Ecriture impossible dans le fichier '.$nomFichier.', Assurez-vous des droits du dossier de logs et du fichier';
134
		$e = new ErrorException($message,0,E_USER_WARNING,__FILE__,__LINE__);
135
		GestionnaireException::gererException($e);
136
	}
122 aurelien 137
 
123 aurelien 138
	/**
139
	 * destructeur de classe, ferme les descripteurs ouverts
140
	 */
141
	public function __destruct() {
142
		foreach(self::$fichiersLog as $nomFichier => $fp) {
143
			fclose($fp);
144
		}
145
	}
122 aurelien 146
}
147
?>