Remove dynamic exceptions
[anna.git] / include / anna / core / tracing / Logger.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_core_tracing_Logger_hpp
10 #define anna_core_tracing_Logger_hpp
11
12 #include <syslog.h>
13
14 #ifdef _MT
15 #include <pthread.h>
16 #endif
17
18 #include <anna/core/mt/NRMutex.hpp>
19 #include <anna/core/mt/Guard.hpp>
20
21 namespace anna {
22
23 class DataBlock;
24
25 /**
26    Facilidad para la realizacion de archivos de historico (logs) de nuestra aplicacion.
27
28    @see Patron proxy  http://maniaco/anna/docs/html/DesingPatterns//pat4gfso.htm
29 */
30 class Logger {
31 public:
32   /**
33      Nivel de las trazas de historico.
34
35      Para mas informacion ver los niveles de emergencia listados en: man syslog.conf
36
37      @see Logger
38   */
39   enum Level {
40     Emergency = LOG_EMERG,
41     Alert = LOG_ALERT, Critical = LOG_CRIT, Error = LOG_ERR, Warning = LOG_WARNING,
42     Notice = LOG_NOTICE, Information = LOG_INFO, Debug = LOG_DEBUG,
43     Local0 = LOG_LOCAL0, Local1 = LOG_LOCAL1, Local2 = LOG_LOCAL2, Local3 = LOG_LOCAL3,
44     Local4 = LOG_LOCAL4, Local5 = LOG_LOCAL5, Local6 = LOG_LOCAL6, Local7 = LOG_LOCAL7
45   };
46
47   /**
48      Clase virtual que debemos asociar al Logger para transferir las trazas al medio
49      deseado.
50
51      @see DefaultWriter
52   */
53   class Writer {
54   public:
55     /**
56        Destructor.
57     */
58     virtual ~Writer();
59
60     /**
61        Metodo virtual que debe inicializar el funcionamiento del Writer particular.
62
63        @param id Identificador logico. Usado en el  DefaultWriter para inicializar el sistema
64        del log (metodo syslog).
65     */
66     virtual void initialize(const char* id)  = 0;
67
68     /**
69        Transfiere el mensaje de trazas al log del sistema. El metodo implementado debe ser
70        MT-Safe.
71        No es necesario realizar ningun control del nivel de trazas establecido ya que si la
72        clase  Logger ha decidido llamar a este metodo es porque el nivel indicado esta
73        activo.
74
75        @param level Nivel de las trazas que vamos a sacar.
76        @param text Especificacion de formato del mensaje. Similar al usado en el comando sprintf.
77     */
78     virtual void do_write(int level, const char* text, ...)  = 0;
79
80   protected:
81     /**
82        Constructor.
83
84        @param bufferSize Numero de bytes reservado para la linea de trazas.
85     */
86     Writer(const int bufferSize);
87
88     /**
89        Constructor.
90     */
91     Writer();
92
93     /**
94        @return La instancia del bloque de datos con memoria reservada para poder interpretar los
95        parametros.
96     */
97     DataBlock& getDataBlock() { return *a_dataBlock; }
98
99   private:
100     DataBlock* a_dataBlock;
101   };
102
103   /**
104      Inicializa el sistema de historico de nuestra aplicacion. Solo debe invocarse una unica vez
105      al comienzo de la aplicacion.
106
107      Al no indicar ninguna clase encargada de transferir los datos de la aplicacion al
108      sistema de historico se establece el  Writer por defecto.
109
110      Este metodo no es MT-safe por lo que tenemos que estar seguros que no se puede invocar desde
111      varios thread simultaneamente. Lo mas aconsejable es invocarlo desde el comienzo de la
112      aplicacion.
113
114      @param ident Identifica las trazas de nuestra aplicacion que apareceran  en el archivo de historico.
115      Deberia ser un texto con entre 4 y 16 caracteres.
116
117      @see DefaultWriter.
118   */
119   static void initialize(const char* ident) ;
120
121   /**
122      Inicializa el sistema de historico de nuestra aplicacion. Solo debe invocarse una unica vez
123      al comienzo de la aplicacion.
124
125      Este metodo no es MT-safe por lo que tenemos que estar seguros que no se puede invocar desde
126      varios thread simultaneamente. Lo mas aconsejable es invocarlo desde el comienzo de la
127      aplicacion.
128
129      @param ident Identifica las trazas de nuestra aplicacion que apareceran  en el archivo de historico.
130      Deberia ser un texto con entre 4 y 16 caracteres.
131      @param writer Establece el objeto encargado de transferir los datos de la aplicacion
132      al sistema de historico. La instancia pasada como parametro debera estar disponible mientras
133      no termine la ejecucion de nuestra aplicacion. Podemos indicar NULL para desactivar
134      completamente cualquier sistema de trazas.
135
136      @see DefaultWriter.
137   */
138   static void initialize(const char* ident, Writer* writer) ;
139
140   /**
141      @return El nivel de trazado de nuestra aplicacion.
142   */
143   static Level getLevel() { return st_level; }
144
145   /**
146      Establece el nivel de trazado de nuestra aplicacion. El nivel de trazado por defecto
147      de nuestra aplicacion dependera del modo de compilacion, en modo depuracion el nivel
148      de trazado por defecto sera  Debug, en otro caso sera  Warning.
149
150      Solo apareceran en el historico las trazas que lleven un nivel menor que el establecido
151      en este metodo.
152
153      @param level Nivel de trazado que deseamos establecer.
154   */
155   static void setLevel(const Level level)
156   noexcept(false) {
157     Guard guard(st_mutex, "Logger::setLevel");
158     st_level = (level <= Error) ? Error : level;
159   }
160
161   /**
162      Comprueba si el nivel de trazado recibido como parametro esta activo en nuestra aplicacion.
163
164      @param level Nivel de trazado que deseamos comprobar.
165
166      @return @em true Si el nivel de trazado de nuestra aplicacion es mayor que el recibido como
167      parametro o @em false en otro caso.
168   */
169   static bool isActive(const Level level) {
170     return (st_writer != NULL && level <= Error) ? true : (st_enabled && level <= st_level && st_writer != NULL);
171   }
172
173   /**
174      Desactiva el sistema de trazado.
175   */
176   static void disable() noexcept(false);
177
178   /**
179      Activa el sistema de trazado y establece el nivel de trazado existente antes
180      de la desactivacion (Ver  #disable).
181   */
182   static void enable() noexcept(false);
183
184   /**
185    * Establece el valor del indicador que hace que se vuelque el PID del proceso en la linea de trazas.
186    *
187    * Puede ser util cuando el programa principal cree procesos hijos mediante a la invocacion al metodo \em fork.
188    *
189    * \param showPID Valor del indicador.
190    */
191   static void showPID(const bool show) ;
192
193   /**
194      Traza el texto recibido en el historico con el nivel indicado.
195
196      La traza solo sera registrada en el historico si el nivel de trazado recibido como
197      parametro esta habilitado.
198
199      @param level Nivel de la traza que deseamos registrar.
200      @param text Texto de la traza.
201      @param fromFile Nombre del archivo donde se genera la traza.
202      @param fromLine Numero de linea del archivo donde se genera la traza.
203   */
204   static void write(const Level level, const char* text, const char* fromFile, const int fromLine) ;
205
206   /**
207      Traza el texto recibido en el historico con el nivel indicado.
208
209      La traza solo sera registrada en el historico si el nivel de trazado recibido como
210      parametro esta habilitado.
211
212      @param level Nivel de la traza que deseamos registrar.
213      @param text Texto de la traza.
214      @param fromFile Nombre del archivo donde se genera la traza.
215      @param fromLine Numero de linea del archivo donde se genera la traza.
216   */
217   static void write(const Level level, const std::string& text, const char* fromFile, const int fromLine) {
218     write(level, text.c_str(), fromFile, fromLine);
219   }
220
221   /**
222      Traza el texto recibido en el historico con el nivel indicado.
223
224      La traza solo sera registrada en el historico si el nivel de trazado recibido como
225      parametro esta habilitado.
226
227      @param level Nivel de la traza que deseamos registrar.
228      @param text Texto de la traza.
229      @param value Contenido de una cadena.
230      @param fromFile Nombre del archivo donde se genera la traza.
231      @param fromLine Numero de linea del archivo donde se genera la traza.
232   */
233   static void write(const Level level, const char* text, const char* value, const char* fromFile, const int fromLine) ;
234
235   /**
236      Traza el texto recibido en el historico con el nivel indicado.
237
238      La traza solo sera registrada en el historico si el nivel de trazado recibido como
239      parametro esta habilitado.
240
241      @param level Nivel de la traza que deseamos registrar.
242      @param text Texto de la traza.
243      @param value Contenido de una cadena.
244      @param fromFile Nombre del archivo donde se genera la traza.
245      @param fromLine Numero de linea del archivo donde se genera la traza.
246   */
247   static void write(const Level level, const char* text, const std::string& value, const char* fromFile, const int fromLine)
248   {
249     write(level, text, value.c_str(), fromFile, fromLine);
250   }
251
252   /**
253      Traza el texto recibido en el historico con el nivel indicado.
254
255      La traza solo sera registrada en el historico si el nivel de trazado recibido como
256      parametro esta habilitado.
257
258      @param level Nivel de la traza que deseamos registrar.
259      @param text Texto de la traza.
260      @param value Contenido de una cadena.
261      @param fromFile Nombre del archivo donde se genera la traza.
262      @param fromLine Numero de linea del archivo donde se genera la traza.
263   */
264   static void write(const Level level, const std::string& text, const std::string& value, const char* fromFile, const int fromLine)
265   {
266     write(level, text.c_str(), value.c_str(), fromFile, fromLine);
267   }
268
269   /**
270      Traza el texto recibido en el historico con el nivel indicado.
271
272      La traza solo sera registrada en el historico si el nivel de trazado recibido como
273      parametro esta habilitado.
274
275      @param level Nivel de la traza que deseamos registrar.
276      @param text Texto de la traza.
277      @param value Valor numerico.
278      @param fromFile Nombre del archivo donde se genera la traza.
279      @param fromLine Numero de linea del archivo donde se genera la traza.
280   */
281   static void write(const Level level, const char* text, const int value, const char* fromFile, const int fromLine)
282   ;
283
284   /**
285      Traza el texto recibido en el historico con el nivel indicado.
286
287      La traza solo sera registrada en el historico si el nivel de trazado recibido como
288      parametro esta habilitado.
289
290      @param level Nivel de la traza que deseamos registrar.
291      @param text Texto de la traza.
292      @param value Bloque de datos a transferir al log del sistema.
293      @param fromFile Nombre del archivo donde se genera la traza.
294      @param fromLine Numero de linea del archivo donde se genera la traza.
295   */
296   static void write(const Level level, const char* text, const DataBlock& value, const char* fromFile, const int fromLine)
297   ;
298
299   /**
300      Si el nivel \em Debug esta activado traza el texto recibido en el historico.
301      @param text Texto de la traza.
302      @param fromFile Nombre del archivo donde se genera la traza.
303      @param fromLine Numero de linea del archivo donde se genera la traza.
304   */
305   static void debug(const std::string& text, const char* fromFile, const int fromLine)
306   {
307     write(Logger::Debug, text, fromFile, fromLine);
308   }
309
310   /**
311      Si el nivel \em Information esta activado traza el texto recibido en el historico.
312      @param text Texto de la traza.
313      @param fromFile Nombre del archivo donde se genera la traza.
314      @param fromLine Numero de linea del archivo donde se genera la traza.
315   */
316   static void information(const std::string& text, const char* fromFile, const int fromLine)
317   {
318     write(Logger::Information, text, fromFile, fromLine);
319   }
320
321   /**
322      Si el nivel \em Notice esta activado traza el texto recibido en el historico.
323      @param text Texto de la traza.
324      @param fromFile Nombre del archivo donde se genera la traza.
325      @param fromLine Numero de linea del archivo donde se genera la traza.
326   */
327   static void notice(const std::string& text, const char* fromFile, const int fromLine)
328   {
329     write(Logger::Notice, text, fromFile, fromLine);
330   }
331
332   /**
333       Si el nivel \em Warning esta activado traza el texto recibido en el historico.
334       @param text Texto de la traza.
335       @param fromFile Nombre del archivo donde se genera la traza.
336       @param fromLine Numero de linea del archivo donde se genera la traza.
337    */
338   static void warning(const std::string& text, const char* fromFile, const int fromLine)
339   {
340     write(Logger::Warning, text, fromFile, fromLine);
341   }
342
343   /**
344       Si el nivel \em Error esta activado traza el texto recibido en el historico.
345       @param text Texto de la traza.
346       @param fromFile Nombre del archivo donde se genera la traza.
347       @param fromLine Numero de linea del archivo donde se genera la traza.
348    */
349   static void error(const std::string& text, const char* fromFile, const int fromLine)
350   {
351     write(Logger::Error, text, fromFile, fromLine);
352   }
353
354   /**
355       Si el nivel \em Critical esta activado traza el texto recibido en el historico.
356       @param text Texto de la traza.
357       @param fromFile Nombre del archivo donde se genera la traza.
358       @param fromLine Numero de linea del archivo donde se genera la traza.
359    */
360   static void critical(const std::string& text, const char* fromFile, const int fromLine)
361   {
362     write(Logger::Critical, text, fromFile, fromLine);
363   }
364
365   /**
366       Si el nivel \em Alert esta activado traza el texto recibido en el historico.
367       @param text Texto de la traza.
368       @param fromFile Nombre del archivo donde se genera la traza.
369       @param fromLine Numero de linea del archivo donde se genera la traza.
370    */
371   static void alert(const std::string& text, const char* fromFile, const int fromLine)
372   {
373     write(Logger::Alert, text, fromFile, fromLine);
374   }
375
376   /**
377       Si el nivel \em Emergency esta activado traza el texto recibido en el historico.
378       @param text Texto de la traza.
379       @param fromFile Nombre del archivo donde se genera la traza.
380       @param fromLine Numero de linea del archivo donde se genera la traza.
381    */
382   static void emergency(const std::string& text, const char* fromFile, const int fromLine)
383   {
384     write(Logger::Emergency, text, fromFile, fromLine);
385   }
386
387   /**
388      @return La cadena que identifica al nivel recibido como parametro.
389
390   */
391   static const char* asString(const Level level) ;
392
393   /**
394      Traduce la cadena recibida al nivel correspondiente.
395
396      @param level Cadena que deberia contener un nombre de nivel (emerg, alert, crit, err, warning, notice, info, debug).
397
398      \warning Debe de ser alguno de los siguiente literales: emerg, alert, crit, err, warning, notice, info, debug
399   */
400   static Level asLevel(const char* level) noexcept(false);
401
402 private:
403   static NRMutex st_mutex;
404   static Level st_level;
405   static bool st_enabled;
406   static Writer* st_writer;
407
408 #ifndef _MT
409   static pid_t st_pid;
410 #endif
411
412   Logger();
413
414   friend class Logger::Writer;
415 };
416
417 } //namespace anna
418
419 #endif
420
421