Categorías del Tutorial

icono_twiter
Jose Manuel Sánchez Suárez

Consultor tecnológico de desarrollo de proyectos informáticos.

Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación

Somos expertos en Java/J2EE

Ver todos los tutoriales del autor

Fecha de publicación del tutorial: 2011-03-09

Tutorial visitado 6.259 veces Descargar en PDF
Log4J: Modificar el nivel de log en tiempo de ejecución con el soporte de Spring.

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

A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

Share |
Anímate y coméntanos lo que pienses sobre este TUTORIAL:

Fecha publicación: 2011-03-09-12:19:59

Autor: jmsanchez

Muchas gracias por la info jeyex.

Me parece lógico que añadir un appender no se recargue la conf.

Un saludo.

Jose.

Fecha publicación: 2011-03-09-12:08:32

Autor: jeyex

lo siento pero se me fue una frase en frances :)

Le redemarrage de spring sera obligatorio ! = El reinicio de spring sera obligatorio

Fecha publicación: 2011-03-09-12:07:22

Autor: jeyex

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