Log4J: ¿Cómo cambiar el nivel de log en tiempo de ejecución?
Una tarea fundamental en todo proyecto informático es la generación de log o trazas, generalmente para detectar y solucionar los posibles errores
que pudieran producirse.
Debido a que no todos las aplicaciones pueden pararse para cambiar el nivel de log, es preciso tener un mecanismo para modificar el comportamiento de las trazas en tiempo de ejecución.
A continuación vamos a ver un ejemplo de como poder modificar la configuración de Log4j en caliente (sin parar la aplicación)
El ejemplo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
package com.autentia.log4j; import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; /** * Sencilla aplicación de consola * @author Carlos García. Autentia. * @see http://www.mobiletest.es */ public class Log4JRuntimeLevelChanged { public static void main(String[] args) { try { // Inicializamos el sistema de log monitorizando cada 20 segundos // los cambios (o la creación) del archivo de configuración "logging.xml". DOMConfigurator.configureAndWatch("logging.xml", 20*1000); Logger logger = Logger.getLogger(Log4JRuntimeLevelChanged.class); for (int i = 0; i < 100; i++){ // Ahora sacamos par de trazas logger.debug("Debug: " + i); logger.error("Error: " + i); // Nos dormimos un par de segundos Thread.sleep(2000); } } catch (java.lang.InterruptedException ex){ // No hacemos nada } catch (Exception ex){ System.out.println(ex); } finally { System.out.println("Fin"); } } } |
Archivo de configuración de Log4j: logging.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false"> <appender name="console_appender" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%n%d{yyyy-MM-dd HH:mm:ss} [%-5p] [%l] %n%m%n" /> </layout> </appender> <appender name="file_appender" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="test_archive.log" /> <param name="MaxFileSize" value="1000000" /> <param name="MaxBackupIndex" value="5" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%n%d{yyyy-MM-dd HH:mm:ss} [%-5p] [%l] %n%m%n" /> </layout> </appender> <root> <priority value="warn"/> <appender-ref ref="file_appender"/> <appender-ref ref="console_appender"/> </root> </log4j:configuration> |
Si ejecutamos la aplicación y cambiamos el nivel de log de error a debug podrímos obtener una salida como la que se muestra a continuación, en donde podemos ver como las primeras salidas están a nivel de ERROR pero luego comienzan a sacarse también trazas de DEBUG.
test_archive.log
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
2008-07-17 17:32:03 [ERROR] [com.autentia.log4j.Log4JRuntimeLevelChanged.main(Log4JRuntimeLevelChanged.java:23)] Error: 0 2008-07-17 17:32:05 [ERROR] [com.autentia.log4j.Log4JRuntimeLevelChanged.main(Log4JRuntimeLevelChanged.java:23)] Error: 1 2008-07-17 17:32:07 [ERROR] [com.autentia.log4j.Log4JRuntimeLevelChanged.main(Log4JRuntimeLevelChanged.java:23)] Error: 2 2008-07-17 17:32:09 [DEBUG] [com.autentia.log4j.Log4JRuntimeLevelChanged.main(Log4JRuntimeLevelChanged.java:22)] Debug: 3 2008-07-17 17:32:09 [ERROR] [com.autentia.log4j.Log4JRuntimeLevelChanged.main(Log4JRuntimeLevelChanged.java:23)] Error: 3 2008-07-17 17:32:11 [DEBUG] [com.autentia.log4j.Log4JRuntimeLevelChanged.main(Log4JRuntimeLevelChanged.java:22)] Debug: 4 2008-07-17 17:32:11 [ERROR] [com.autentia.log4j.Log4JRuntimeLevelChanged.main(Log4JRuntimeLevelChanged.java:23)] Error: 4 |
Otros tutoriales relaccionados
- Introducción a Log4j
- Log4J: Cómo crear distintos logs en función de su naturaleza y nivel
- Log4J, SMTPAppender: Envio de trazas de log por email
Conclusiones
La gestión de trazas es una parte fundamental de toda aplicación, por lo que es recomendable establecer alguna política o pautas al respecto dentro del proyecto.
Recordar que la mayor parte del dinero de un sistema informático se va en mantenimientos, así que un buen sistema de logs nos hará la vida más fácil y nos permitirá ahorrar muchos esfuerzos (dinerito).
Un saludo, Carlos García, creador de Mobiletest.