Log4J: Modificar el nivel de log en tiempo de ejecución con el soporte de Spring

3
16278

Log4J: Modificar el nivel de log en tiempo de ejecución con el soporte de Spring.

0. Índice de contenidos.


1. Introducción

Ya vimos hace tiempo, de la mano de mi compi Carlos,
cómo cambiar el nivel de log de Log4J en tiempo de ejecución,
cuyo objetivo era mostrarnos un mecanismo para modificar el comportamiento de las trazas en tiempo de ejecución, como comúnmente llamamos «en caliente».

En este tutorial vamos a conseguir el mismo objetivo con el soporte de un listener que nos proporciona Spring para configurar la
trazabilidad de una aplicación web e indicar si necesitamos que recargue dicha configuración periódicamente.


2. Entorno.

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro 17′ (2.93 GHz Intel Core 2 Duo, 4GB DDR3 SDRAM).
  • Sistema Operativo: Mac OS X Snow Leopard 10.6.1
  • Spring 3.0.5.RELEASE
  • Apache Tomcat 6.0.20


3. Dependencias.

Para hacer uso del filtro necesitamos incluir las siguientes librerias:

  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>3.0.5.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.14</version>
  </dependency>	

En la librería spring-web podemos encontrar el filtro en el siguiente paquete org.springframework.web.util, junto con otras utilidades como un generador de cookies.


4. Configuración.

La configuración es muy simple, pues basta con incluir el siguiente filtro en el descriptor de despliegue web.xml.

	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>classpath:myappLog4j.properties</param-value>
	</context-param>
	<context-param>
		<param-name>log4jRefreshInterval</param-name>
		<param-value>2000</param-value>
	</context-param>

En el parámetro de contexto log4jConfigLocation le indicamos la ubicación y el nombre del fichero de propiedades donde mantenemos la configuración de log4j. Podemos hacer uso de los prefijos de Spring para indicar que dicho fichero forma parte del classpath, se encuentra en una ubicación fija en disco o en una URL.
Si estamos trabajando con Apache Tomcat y le indicamos una ubicación en el classpath podemos ubicar el fichero en el directorio lib de la instalación de Tomcat.

En el parámetro de contexto log4jRefreshInterval le indicamos el periodo de refresco en milisegundos que define la periodicidad de la recarga del fichero de propiedades anteriormente indicado.

El fichero de propiedades puede tener un contenido como el que sigue:


log4j.rootLogger=INFO, stdout

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %-5p %l - %m%n

### set specific log levels - FATAL, ERROR, WARN, INFO, DEBUG, TRACE ###

log4j.logger.com.myapp = TRACE

log4j.logger.org.hibernate = WARN
log4j.logger.org.springframework = WARN
	

Y podemos modificar su contenido en cualquier momento que, cada 2 segundos, será recargado por el listener.


5. Referencias.


6. Conclusiones.

Cuando proponemos Spring como engranaje de las distintas capas de la arquitectura de nuestras aplicaciones no sólo nos beneficiamos del contexto de inyección, sino de todas aquellas
facilidades que Spring pone a nuestra disposición para, en definitiva, hacernos el desarrollo más sencillo.

Un saludo.

Jose

jmsanchez@autentia.com

3 COMENTARIOS

  1. Muy buen articulo !
    Como contribucion, me gustaria agregar que el unico parametro que no sera tomado en caliente por log4j es si cambias de appender para el log4j.rootLogger. Le redemarrage de spring sera obligatorio !

    Es decir si pasas de :

    log4j.rootLogger=INFO, stdout

    a :

    log4j.rootLogger=INFO, FILE

    donde: FILE es un appender de tipo archivo por ejemplo:

    log4j.appender.FILE=org.apache.log4j.RollingFileAppender
    log4j.appender.FILE.File=${catalina.home}/logs/tulogfile.log
    log4j.appender.FILE.MaxFileSize=10MB
    log4j.appender.FILE.MaxBackupIndex=10
    log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.FILE.layout.ConversionPattern=[%t] %d %-5p %c{2}.%m%n

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad