00001 /* Implémentation Linux de la bibliotheque XADLL de Sidena 00002 * Copyright (C) 2005 ENSTAR 00003 * 00004 * This program is free software; you can redistribute it and/or modify 00005 * it under the terms of the GNU General Public License as published by 00006 * the Free Software Foundation; either version 2 of the License, or 00007 * (at your option) any later version. 00008 * 00009 * This program is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 * GNU General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU General Public License 00015 * along with this program; if not, write to the Free Software 00016 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00017 * 00018 * You can contact us: 00019 * Association ENSTAR 00020 * Ecole Nationale Superieure de Techniques Avancees 00021 * 32 boulevard Victor 00022 * 75739 Paris Cedex 15 00023 * FRANCE 00024 * 00025 * enstar@ensta.fr 00026 */ 00027 00028 /* $Id: erreur.h 49 2006-03-14 11:01:24Z francois $ */ 00029 00030 /** @file erreur.h 00031 * @brief Module de gestion des messages de log/erreur 00032 * @author Francois Fevotte <francois.fevotte@ensta.org> 00033 * $Revision: 49 $ 00034 * $Date: 2006-03-14 12:01:24 +0100 (Tue, 14 Mar 2006) $ 00035 * 00036 * Ce module permet de gérer l'affichage de messages sur le flux d'erreur standard et dans un fichier de log. 00037 * Il utilise un certain nombre de macros qui doivent être redéfinies dans le fichier appelant 00038 * (@ref LOGFILE, @ref LOG_LEVEL, @ref SCREEN_LEVEL, @ref SOURCE_ERREUR). 00039 * 00040 * Les fonctions d'affichage des messages sont décrites dans l'espace de noms @link erreur::generique erreur@endlink. 00041 * 00042 * Exemple d'inclusion des fonctions de gestion d'erreur : 00043 * 00044 * fich1.c : 00045 * @code 00046 * #define SOURCE_ERREUR "fich1.c" 00047 * #include "erreur.h" 00048 * 00049 * //... 00050 * 00051 * erreur::warning( "attention" ); 00052 * @endcode 00053 * 00054 * fich2.c : 00055 * @code 00056 * #define SOURCE_ERREUR "fich2.c" 00057 * #include "erreur.h" 00058 * 00059 * //... 00060 * 00061 * erreur::fatale( "crash" ); 00062 * @endcode 00063 */ 00064 00065 #ifndef ERREUR_C 00066 #define ERREUR_C 00067 00068 00069 /* Gestion des mots clés 'extern' : seul le fichier xalib.c définira réellement le fichier de log */ 00070 #ifdef XALIB_C 00071 #define EXTERN 00072 #else 00073 #define EXTERN extern 00074 #endif 00075 00076 /** @brief Emplacement du fichier de log des erreurs 00077 */ 00078 EXTERN FILE* logfile; 00079 00080 00081 /** @brief Fichier de log des erreurs 00082 * 00083 * Chemin relatif vers le fichier de log dans lequel seront stockés les messages. 00084 * Le fichier doit pouvoir être ouvert en écriture ou créé le cas échéant 00085 */ 00086 #ifndef LOGFILE 00087 #define LOGFILE "./xa.log" 00088 #endif 00089 00090 /** @brief Niveau de priorité maximum des messages affichés à l'écran 00091 * 00092 * Seuls les messages de priorité inférieure ou égale à ce niveau seront affichés sur le flux d'erreur. 00093 */ 00094 #ifndef SCREEN_LEVEL 00095 #define SCREEN_LEVEL 3 00096 #endif 00097 00098 /** @brief Niveau de priorité maximum des messages ajoutés au log 00099 * 00100 * Seuls les messages de priorité inférieure ou égale à ce niveau seront ajoutés au fichier de log. 00101 */ 00102 #ifndef LOG_LEVEL 00103 #define LOG_LEVEL 2 00104 #endif 00105 00106 /** @brief Fichier source déclenchant l'erreur 00107 * 00108 * Cette macro doit contenir le nom du fichier source qui déclenche l'erreur. 00109 * C'est le nom de fichier qui apparaitra en début de ligne lors de l'affichage du message. 00110 */ 00111 #ifndef SOURCE_ERREUR 00112 #define SOURCE_ERREUR "inconnu" 00113 #endif 00114 00115 #include <stdlib.h> 00116 #include <time.h> 00117 #include <stdio.h> 00118 00119 00120 /** @namespace erreur 00121 * @brief Module de gestion des messages de log/erreur 00122 * 00123 * L'utilisation de ce module est détaillée dans la documentation du fichier erreur.h 00124 * 00125 * @see erreur.h 00126 */ 00127 namespace erreur 00128 { 00129 void openlog(); 00130 void log(char *message, int prio); 00131 void screen(char *message, int prio); 00132 void fatale(char *message); 00133 void warning(char *message); 00134 void debug(char *message); 00135 void generique(char *message, int prio); 00136 void closelog(); 00137 } 00138 00139 /** @brief Ouverture du fichier de log 00140 * 00141 * Ouvre le fichier de log designe par la macro LOGFILE 00142 * dans la variable globale logfile 00143 */ 00144 inline void erreur::openlog() 00145 { 00146 logfile=fopen(LOGFILE,"a"); 00147 if( logfile==NULL ) 00148 { 00149 perror( "erreur::openlog " ); 00150 exit(EXIT_FAILURE); 00151 } 00152 } 00153 00154 /** @brief Fermeture du fichier de log 00155 */ 00156 inline void erreur::closelog() 00157 { 00158 fclose(logfile); 00159 } 00160 00161 /** @brief Ajout d'un message au log 00162 * 00163 * Ajoute le message d'erreur à la fin du fichier de log défini par la macro LOGFILE 00164 * selon le format : 00165 * @verbatim priorité [source] aaaa/mm/jj hh:mm:ss message @endverbatim 00166 * 00167 * @param message le message d'erreur 00168 * @param prio la priorié du message: 00169 * @li 1 erreur fatale 00170 * @li 2 warning 00171 * @li 3 message de déboguage 00172 */ 00173 inline void erreur::log(char *message, int prio) 00174 { 00175 time_t tmp; 00176 struct tm *tmp2; 00177 00178 time(&tmp); 00179 tmp2 = localtime(&tmp); 00180 00181 fprintf( logfile, "<niveau%d> [%s]\t%4d/%02d/%02d %02d:%02d:%02d\t%s\t</niveau%d>\n", 00182 prio,SOURCE_ERREUR, 00183 tmp2->tm_year+1900,tmp2->tm_mon,tmp2->tm_mday, 00184 tmp2->tm_hour,tmp2->tm_min,tmp2->tm_sec, 00185 message, prio); 00186 } 00187 00188 00189 /** @brief Affichage d'un message à l'écran 00190 * 00191 * Affiche le message sur la sortie d'erreur standard selon le format : 00192 * @verbatim priorité [source] message @endverbatim 00193 * 00194 * @param message le message d'erreur 00195 * @param prio la priorié du message: 00196 * @li 1 erreur fatale 00197 * @li 2 warning 00198 * @li 3 message de déboguage 00199 */ 00200 inline void erreur::screen(char *message, int prio) 00201 { 00202 fprintf( stderr, "<niveau%d> [%s]\t%s\t</niveau%d>\n", prio, SOURCE_ERREUR, message, prio); 00203 fflush( stderr ); 00204 } 00205 00206 00207 /** @brief Message d'erreur fatale 00208 * 00209 * Traite un message de priorité 1 (erreur fatale) selon le mode de erreur::generique() 00210 * 00211 * @param message le message d'erreur 00212 */ 00213 inline void erreur::fatale(char *message) 00214 { 00215 #if LOG_LEVEL>0 00216 log(message,1); 00217 #endif 00218 00219 #if SCREEN_LEVEL>0 00220 screen(message,1); 00221 #endif 00222 } 00223 00224 00225 /** @brief Message de warning 00226 * 00227 * Traite un message de priorité 2 (warning) selon le mode de erreur::generique() 00228 * 00229 * @param message le message de warning 00230 */ 00231 inline void erreur::warning(char *message) 00232 { 00233 #if LOG_LEVEL>1 00234 log(message,2); 00235 #endif 00236 00237 #if SCREEN_LEVEL>1 00238 screen(message,2); 00239 #endif 00240 } 00241 00242 /** @brief Message de déboguage 00243 * 00244 * Traite un message de priorité 3 (déboguage) selon le mode de erreur::generique() 00245 * 00246 * @param message le message de déboguage 00247 */ 00248 inline void erreur::debug(char *message) 00249 { 00250 #if LOG_LEVEL>2 00251 log(message,3); 00252 #endif 00253 00254 #if SCREEN_LEVEL>2 00255 screen(message,3); 00256 #endif 00257 } 00258 00259 00260 /** @brief Message d'erreur 00261 * 00262 * Traite un message d'erreur de priorité donnée : 00263 * @li si la priorité du message est inférieure à LOG_LEVEL, 00264 * le message est ajouté au log (Cf. log() ) 00265 * @li si la priorité du message est inférieure à SCREEN_LEVEL, 00266 * le message est affiché sur le flux d'erreurs (Cf. screen() ) 00267 * 00268 * @param message le message d'erreur 00269 * @param prio la priorité du message 00270 */ 00271 inline void erreur::generique(char *message, int prio=4) 00272 { 00273 if( prio<LOG_LEVEL ) 00274 log(message,prio); 00275 00276 if( prio<SCREEN_LEVEL ) 00277 screen(message,prio); 00278 } 00279 00280 #undef LOGFILE 00281 #undef SCREEN_LEVEL 00282 #undef LOG_LEVEL 00283 #undef SOURCE_ERREUR 00284 00285 #endif