Ir al contenido principal

Modificación de nivel de log con Spring

Es muy importante desarrollar nuestras aplicaciones con un sistema de log adecuado y fácilmente configurable. Todas nuestras aplicaciones deberían tener un diseño de log correcto para la detección rápida de errores. Recordemos que la mayor parte del esfuerzo (dinero) en las aplicaciones se pierde en el mantenimiento de las mismas.

En este artículo vamos a describir como configurar un listener del framework Spring que lee dinámicamente la configuración de nuestro fichero de log y nos permite así modificar en caliente el nivel de log. Esto también se puede realizar programaticamente mediante la API proporcionada por algunas librerías de log como log4j.

Lo primero que hecho para ilustrar el ejemplo ha sido crear una aplicación web muy simple con Eclipse que contiene un servlet. Éste lo único que va a realizar es escribir una sentencia de log de ERROR, otra de INFO y otra de DEBUG.




El código del método doGet servlet es el siguiente:


/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
logger.error("Log de ERROR");
logger.info("Log de INFO");
logger.debug("Log de DEBUG");

}




En la librería spring-web encontramos un filtro en el paquete org.spring.framework.util junto con otras utilidades como un generador de cookies.

En el fichero web.xml de nuestra aplicación debemos añadir las siguientes líneas:


<listener>
 <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
 <param-name>log4jConfigLocation</param-name>
 <param-value>classpath:log4j.xml</param-value>
</context-param>
<context-param>
 <param-name>log4jRefreshInterval</param-name>
 <param-value>1000</param-value>
</context-param>


En el parámetro log4jConfigLocation configuramos la ubicación de nuestro fichero de configuración de log4j. En este caso mediante el prefijo classpath indicamos que nuestro fichero está en el classpath y se llama log4j.properties. Mediante el parámetro log4jRefreshInterval definimos el periodo en ms en el cual se recarga nuevamente la configuración de log4j.

En nuestro fichero de propiedades definimos un log que escribe los mensajes por consola a nivel de error por defecto:


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">


<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[SPRINGLOG]%d [%t] %p %c. %M:%L | %m%n" />
</layout>
</appender>
<root>
<priority value="error" />
<appender-ref ref="CONSOLE" />
</root>
</log4j:configuration>


Si realizamos una petición al servlet que hemos creado anteriormente, veremos que el resultado del log es:


[SPRINGLOG]2011-03-14 13:11:21,482 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] ERROR es.jpascu.springlog.TestSpringLog. doGet:32 | Log de ERROR


Si ahora cambiamos la configuración del log4j a nivel de debug, el resultado de la invocación al servlet es la siguiente:


[SPRINGLOG]2011-03-14 14:28:03,190 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] ERROR es.jpascu.springlog.TestSpringLog. doGet:32 | Log de ERROR
[SPRINGLOG]2011-03-14 14:28:03,190 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] INFO es.jpascu.springlog.TestSpringLog. doGet:33 | Log de INFO
[SPRINGLOG]2011-03-14 14:28:03,190 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] DEBUG es.jpascu.springlog.TestSpringLog. doGet:34 | Log de DEBUG


Como vemos salen todas las sentencias porque hemos cambiado el nivel de log a debug en caliente.


Visto en AdictosAlTrabajo.




Comentarios

Entradas populares de este blog

Soluciones Alchemy Classic 389 elementos

Hace algún tiempo salió una actualización del Juego Alchemy Classic en la que aparecían más elementos (389 en lugar de 238). Aparte de añadir elementos mejoran algunas traducciones en castellano y mejoran la interfaz, aunque todavía hay algún error en algunos nombres de elementos.

Aquí os dejo las soluciones para los que estén atascados y no puedan dormir por las noches:


Sustancia primaria
Aire=Elemento primario  Fuego=Elemento primario  Agua=Elemento primario  Tierra=Sustancia Primaria Arena=Piedra + Aire Piedra=Tierra + Fuego Arcilla=Arena + Pantano Caliza=Tierra + Amonitas Carbono=Fuego + Madera Cloro=Fuego + Sal + Electricidad CO2(Dióxido de Carbono)=Ceniza + Ácido nítrico Electricidad=Relámpago+ Metales Gas natural= Yacimiento de gas + Pozo Helio=Refinería de gas + Gas Natural Hidrógeno=Electricidad + Agua Hielo=Frío + Agua Imán=Piedra + Metales Metano=Deshechos Vegetales + Pantano Oxígeno=Electricidad + Agua Petróleo=Unidad de Bombeo + Pozo Plutonio=2 + Radiactividad + Metales Sa…

Soluciones Alchemy Classic 442 elementos

Después de la resaca navideña y de la cuesta de enero, volvemos para informar la agradable sorpresa que nos ha dado a los fans de Alchemy Classic la empresa NIASOF,  tras actualizar el juego Alchemy Classic.


Una nueva versión con 442 elementos, interfaz mejorada de grupos y lo más importante, nuevos elementos que descubrir.


La gran novedad de esta actualización son los puntos que tienes asignados, con los que puedes  conseguir pistas sobre los elementos que no has abierto todavía como:



Conseguir un subelemento de un elemento, con 100 puntos.Conseguir el grupo de un subelemento de un elemento (qué lío , jeje), con 35 puntos.
Me gusta, me gusta el enfoque de esta nueva versión aunque los elementos que han sacado me parecen poco originales. Parece que se van agotando las ideas para los elementos nuevos.


Aquí van las soluciones:




Carbon = Tierra + Turba

Sol = Estrella + Tierra


Espacio = 3 x Estrella
Estrella = Helio + Hidrógeno
Oso Panda = Oso + Bambú


Girasol = Sol + Flor


Animales de pezuña hendida = …

Matemáticas y cine.

El otro día estaba viendo por la televisión una película llamada 21 blackjack. En una escena de la película el profesor de matemáticas (Kevin Spacey) le presenta a uno de sus alumnos la siguiente situación: se encuentra en un concurso en la que debe escoger entre tres puertas (1,2 y 3). En dos de ellas hay una cabra, sin embargo en una de las 3 hay un flamante coche nuevo. El alumno responde que quiere abrir la puerta. El presentador, conocedor de lo que hay detrás de cada puerta decide abrir otra puerta diferente mostrando detrás de ella una cabra. El profesor se dirige al alumno y le pregunta, ¿cambiarías la puerta o te quedarías con la puerta que tienes? Muchos de nosotros cambiaríamos de puerta pensando que es una treta del presentador para engañarnos. ¿Cual elegiríais vosotros? Al comienzo tenemos 1/3 de probabilidades de acertar la puerta donde está el coche. Una vez que el presentador abre la puerta con una cabra, la mayoría de gente piensa que hay la misma probabilidad de ace…