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

Vamos a examinar la posibilidad de modificar "en caliente" el nivel de trazas de nuestra aplicación web con una clase de 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

Comentarios

3 respuestas

  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

  2. lo siento pero se me fue una frase en frances 🙂

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

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

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

  • Responsable: IZERTIS S.A.
  • Finalidad: Envío información de carácter administrativa, técnica, organizativa y/o comercial sobre los productos y servicios sobre los que se nos consulta.
  • Legitimación: Consentimiento del interesado
  • Destinatarios: Otras empresas del Grupo IZERTIS. Encargados del tratamiento.
  • Derechos: Acceso, rectificación, supresión, cancelación, limitación y portabilidad de los datos.
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad

Software Architect 👷‍♀️ | Tech Leader 🚀 | Senior Developer: Backend 🧩 and occasionally in Frontend 🖼️ | DevSecOps 🛠️ | Banking 🏛️ | Digital Transformation Agent 🎯 | Problem Solver (Mr. Wolf) 🐺

¿Quieres publicar en Adictos al trabajo?

Te puede interesar

22/06/2026

Juan Antonio Jiménez Torres

Vamos a instrumentalizar un SDD para un microservicio bancario. En este artículo sobre SDD - Spec Driven Development, instrumentalizado sobre OpenSpec vamos a construir una PoC de algo más serio que una tabla periódica. Un microservicio bancario muy simplificado que gestione cuentas y permita hacer transferencias

16/06/2026

Juan Antonio Jiménez Torres

Este es el segundo artículo sobre SDD, Spec Driven Development, instrumentalizado sobre OpenSpec. Pero esta vez nos acercaremos usando softwere gratuito. Por un lado OpenCode en lugar de ClaudeCode y usando el modelo gratuito Gemma4 de Google en lugar de otros de pago.

08/06/2026

Juan Antonio Jiménez Torres

Aprenderemos sobre SDD – Spec Driven Development instrumentalizado sobre OpenSpec. Haremos un primer acercamiento usando ClaudeCode con Sonnet, para luego, en un artículo posterior pasarnos a la versión gratuita de OpenCode con Gemma4