1 // ANNA - Anna is Not 'N' Anymore
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
5 // https://bitbucket.org/testillano/anna
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
11 // * Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 // * Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
17 // * Neither the name of Google Inc. nor the names of its
18 // contributors may be used to endorse or promote products derived from
19 // this software without specific prior written permission.
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 // Authors: eduardo.ramos.testillano@gmail.com
34 // cisco.tierra@gmail.com
37 #ifndef anna_core_tracing_Logger_hpp
38 #define anna_core_tracing_Logger_hpp
46 #include <anna/core/mt/NRMutex.hpp>
47 #include <anna/core/mt/Guard.hpp>
54 Facilidad para la realizacion de archivos de historico (logs) de nuestra aplicacion.
56 @see Patron proxy http://maniaco/anna/docs/html/DesingPatterns//pat4gfso.htm
61 Nivel de las trazas de historico.
63 Para mas informacion ver los niveles de emergencia listados en: man syslog.conf
68 Emergency = LOG_EMERG,
69 Alert = LOG_ALERT, Critical = LOG_CRIT, Error = LOG_ERR, Warning = LOG_WARNING,
70 Notice = LOG_NOTICE, Information = LOG_INFO, Debug = LOG_DEBUG,
71 Local0 = LOG_LOCAL0, Local1 = LOG_LOCAL1, Local2 = LOG_LOCAL2, Local3 = LOG_LOCAL3,
72 Local4 = LOG_LOCAL4, Local5 = LOG_LOCAL5, Local6 = LOG_LOCAL6, Local7 = LOG_LOCAL7
76 Clase virtual que debemos asociar al Logger para transferir las trazas al medio
89 Metodo virtual que debe inicializar el funcionamiento del Writer particular.
91 @param id Identificador logico. Usado en el DefaultWriter para inicializar el sistema
92 del log (metodo syslog).
94 virtual void initialize(const char* id) throw() = 0;
97 Transfiere el mensaje de trazas al log del sistema. El metodo implementado debe ser
99 No es necesario realizar ningun control del nivel de trazas establecido ya que si la
100 clase Logger ha decidido llamar a este metodo es porque el nivel indicado esta
103 @param level Nivel de las trazas que vamos a sacar.
104 @param text Especificacion de formato del mensaje. Similar al usado en el comando sprintf.
106 virtual void do_write(int level, const char* text, ...) throw() = 0;
112 @param bufferSize Numero de bytes reservado para la linea de trazas.
114 Writer(const int bufferSize);
122 @return La instancia del bloque de datos con memoria reservada para poder interpretar los
125 DataBlock& getDataBlock() throw() { return *a_dataBlock; }
128 DataBlock* a_dataBlock;
132 Inicializa el sistema de historico de nuestra aplicacion. Solo debe invocarse una unica vez
133 al comienzo de la aplicacion.
135 Al no indicar ninguna clase encargada de transferir los datos de la aplicacion al
136 sistema de historico se establece el Writer por defecto.
138 Este metodo no es MT-safe por lo que tenemos que estar seguros que no se puede invocar desde
139 varios thread simultaneamente. Lo mas aconsejable es invocarlo desde el comienzo de la
142 @param ident Identifica las trazas de nuestra aplicacion que apareceran en el archivo de historico.
143 Deberia ser un texto con entre 4 y 16 caracteres.
147 static void initialize(const char* ident) throw();
150 Inicializa el sistema de historico de nuestra aplicacion. Solo debe invocarse una unica vez
151 al comienzo de la aplicacion.
153 Este metodo no es MT-safe por lo que tenemos que estar seguros que no se puede invocar desde
154 varios thread simultaneamente. Lo mas aconsejable es invocarlo desde el comienzo de la
157 @param ident Identifica las trazas de nuestra aplicacion que apareceran en el archivo de historico.
158 Deberia ser un texto con entre 4 y 16 caracteres.
159 @param writer Establece el objeto encargado de transferir los datos de la aplicacion
160 al sistema de historico. La instancia pasada como parametro debera estar disponible mientras
161 no termine la ejecucion de nuestra aplicacion. Podemos indicar NULL para desactivar
162 completamente cualquier sistema de trazas.
166 static void initialize(const char* ident, Writer* writer) throw();
169 @return El nivel de trazado de nuestra aplicacion.
171 static Level getLevel() throw() { return st_level; }
174 Establece el nivel de trazado de nuestra aplicacion. El nivel de trazado por defecto
175 de nuestra aplicacion dependera del modo de compilacion, en modo depuracion el nivel
176 de trazado por defecto sera Debug, en otro caso sera Warning.
178 Solo apareceran en el historico las trazas que lleven un nivel menor que el establecido
181 @param level Nivel de trazado que deseamos establecer.
183 static void setLevel(const Level level)
184 throw(RuntimeException) {
185 Guard guard(st_mutex, "Logger::setLevel");
186 st_level = (level <= Error) ? Error : level;
190 Comprueba si el nivel de trazado recibido como parametro esta activo en nuestra aplicacion.
192 @param level Nivel de trazado que deseamos comprobar.
194 @return @em true Si el nivel de trazado de nuestra aplicacion es mayor que el recibido como
195 parametro o @em false en otro caso.
197 static bool isActive(const Level level) throw() {
198 return (st_writer != NULL && level <= Error) ? true : (st_enabled && level <= st_level && st_writer != NULL);
202 Desactiva el sistema de trazado.
204 static void disable() throw(RuntimeException);
207 Activa el sistema de trazado y establece el nivel de trazado existente antes
208 de la desactivacion (Ver #disable).
210 static void enable() throw(RuntimeException);
213 * Establece el valor del indicador que hace que se vuelque el PID del proceso en la linea de trazas.
215 * Puede ser util cuando el programa principal cree procesos hijos mediante a la invocacion al metodo \em fork.
217 * \param showPID Valor del indicador.
219 static void showPID(const bool show) throw();
222 Traza el texto recibido en el historico con el nivel indicado.
224 La traza solo sera registrada en el historico si el nivel de trazado recibido como
225 parametro esta habilitado.
227 @param level Nivel de la traza que deseamos registrar.
228 @param text Texto de la traza.
229 @param fromFile Nombre del archivo donde se genera la traza.
230 @param fromLine Numero de linea del archivo donde se genera la traza.
232 static void write(const Level level, const char* text, const char* fromFile, const int fromLine) throw();
235 Traza el texto recibido en el historico con el nivel indicado.
237 La traza solo sera registrada en el historico si el nivel de trazado recibido como
238 parametro esta habilitado.
240 @param level Nivel de la traza que deseamos registrar.
241 @param text Texto de la traza.
242 @param fromFile Nombre del archivo donde se genera la traza.
243 @param fromLine Numero de linea del archivo donde se genera la traza.
245 static void write(const Level level, const std::string& text, const char* fromFile, const int fromLine) throw() {
246 write(level, text.c_str(), fromFile, fromLine);
250 Traza el texto recibido en el historico con el nivel indicado.
252 La traza solo sera registrada en el historico si el nivel de trazado recibido como
253 parametro esta habilitado.
255 @param level Nivel de la traza que deseamos registrar.
256 @param text Texto de la traza.
257 @param value Contenido de una cadena.
258 @param fromFile Nombre del archivo donde se genera la traza.
259 @param fromLine Numero de linea del archivo donde se genera la traza.
261 static void write(const Level level, const char* text, const char* value, const char* fromFile, const int fromLine) throw();
264 Traza el texto recibido en el historico con el nivel indicado.
266 La traza solo sera registrada en el historico si el nivel de trazado recibido como
267 parametro esta habilitado.
269 @param level Nivel de la traza que deseamos registrar.
270 @param text Texto de la traza.
271 @param value Contenido de una cadena.
272 @param fromFile Nombre del archivo donde se genera la traza.
273 @param fromLine Numero de linea del archivo donde se genera la traza.
275 static void write(const Level level, const char* text, const std::string& value, const char* fromFile, const int fromLine)
277 write(level, text, value.c_str(), fromFile, fromLine);
281 Traza el texto recibido en el historico con el nivel indicado.
283 La traza solo sera registrada en el historico si el nivel de trazado recibido como
284 parametro esta habilitado.
286 @param level Nivel de la traza que deseamos registrar.
287 @param text Texto de la traza.
288 @param value Contenido de una cadena.
289 @param fromFile Nombre del archivo donde se genera la traza.
290 @param fromLine Numero de linea del archivo donde se genera la traza.
292 static void write(const Level level, const std::string& text, const std::string& value, const char* fromFile, const int fromLine)
294 write(level, text.c_str(), value.c_str(), fromFile, fromLine);
298 Traza el texto recibido en el historico con el nivel indicado.
300 La traza solo sera registrada en el historico si el nivel de trazado recibido como
301 parametro esta habilitado.
303 @param level Nivel de la traza que deseamos registrar.
304 @param text Texto de la traza.
305 @param value Valor numerico.
306 @param fromFile Nombre del archivo donde se genera la traza.
307 @param fromLine Numero de linea del archivo donde se genera la traza.
309 static void write(const Level level, const char* text, const int value, const char* fromFile, const int fromLine)
313 Traza el texto recibido en el historico con el nivel indicado.
315 La traza solo sera registrada en el historico si el nivel de trazado recibido como
316 parametro esta habilitado.
318 @param level Nivel de la traza que deseamos registrar.
319 @param text Texto de la traza.
320 @param value Bloque de datos a transferir al log del sistema.
321 @param fromFile Nombre del archivo donde se genera la traza.
322 @param fromLine Numero de linea del archivo donde se genera la traza.
324 static void write(const Level level, const char* text, const DataBlock& value, const char* fromFile, const int fromLine)
328 Si el nivel \em Debug esta activado traza el texto recibido en el historico.
329 @param text Texto de la traza.
330 @param fromFile Nombre del archivo donde se genera la traza.
331 @param fromLine Numero de linea del archivo donde se genera la traza.
333 static void debug(const std::string& text, const char* fromFile, const int fromLine)
335 write(Logger::Debug, text, fromFile, fromLine);
339 Si el nivel \em Information esta activado traza el texto recibido en el historico.
340 @param text Texto de la traza.
341 @param fromFile Nombre del archivo donde se genera la traza.
342 @param fromLine Numero de linea del archivo donde se genera la traza.
344 static void information(const std::string& text, const char* fromFile, const int fromLine)
346 write(Logger::Information, text, fromFile, fromLine);
350 Si el nivel \em Notice esta activado traza el texto recibido en el historico.
351 @param text Texto de la traza.
352 @param fromFile Nombre del archivo donde se genera la traza.
353 @param fromLine Numero de linea del archivo donde se genera la traza.
355 static void notice(const std::string& text, const char* fromFile, const int fromLine)
357 write(Logger::Notice, text, fromFile, fromLine);
361 Si el nivel \em Warning esta activado traza el texto recibido en el historico.
362 @param text Texto de la traza.
363 @param fromFile Nombre del archivo donde se genera la traza.
364 @param fromLine Numero de linea del archivo donde se genera la traza.
366 static void warning(const std::string& text, const char* fromFile, const int fromLine)
368 write(Logger::Warning, text, fromFile, fromLine);
372 Si el nivel \em Error esta activado traza el texto recibido en el historico.
373 @param text Texto de la traza.
374 @param fromFile Nombre del archivo donde se genera la traza.
375 @param fromLine Numero de linea del archivo donde se genera la traza.
377 static void error(const std::string& text, const char* fromFile, const int fromLine)
379 write(Logger::Error, text, fromFile, fromLine);
383 Si el nivel \em Critical esta activado traza el texto recibido en el historico.
384 @param text Texto de la traza.
385 @param fromFile Nombre del archivo donde se genera la traza.
386 @param fromLine Numero de linea del archivo donde se genera la traza.
388 static void critical(const std::string& text, const char* fromFile, const int fromLine)
390 write(Logger::Critical, text, fromFile, fromLine);
394 Si el nivel \em Alert esta activado traza el texto recibido en el historico.
395 @param text Texto de la traza.
396 @param fromFile Nombre del archivo donde se genera la traza.
397 @param fromLine Numero de linea del archivo donde se genera la traza.
399 static void alert(const std::string& text, const char* fromFile, const int fromLine)
401 write(Logger::Alert, text, fromFile, fromLine);
405 Si el nivel \em Emergency esta activado traza el texto recibido en el historico.
406 @param text Texto de la traza.
407 @param fromFile Nombre del archivo donde se genera la traza.
408 @param fromLine Numero de linea del archivo donde se genera la traza.
410 static void emergency(const std::string& text, const char* fromFile, const int fromLine)
412 write(Logger::Emergency, text, fromFile, fromLine);
416 @return La cadena que identifica al nivel recibido como parametro.
419 static const char* asString(const Level level) throw();
422 Traduce la cadena recibida al nivel correspondiente.
424 @param level Cadena que deberia contener un nombre de nivel (emerg, alert, crit, err, warning, notice, info, debug).
426 \warning Debe de ser alguno de los siguiente literales: emerg, alert, crit, err, warning, notice, info, debug
428 static Level asLevel(const char* level) throw(RuntimeException);
431 static NRMutex st_mutex;
432 static Level st_level;
433 static bool st_enabled;
434 static Writer* st_writer;
442 friend class Logger::Writer;