Cambiando dinámicamente el nivel de log4j log

¿Cuáles son los diferentes enfoques para cambiar el nivel de registro de log4j dinámicamente, para que no tenga que volver a desplegar la aplicación? ¿Los cambios serán permanentes en esos casos?

Cambiar el nivel de registro es simple; la modificación de otras partes de la configuración planteará un enfoque más profundo.

LogManager.getRootLogger().setLevel(Level.DEBUG); 

Los cambios son permanentes a través del ciclo de vida del Logger . En la reinicialización, la configuración se leerá y usará, ya que al establecer el nivel en tiempo de ejecución no persiste el cambio de nivel.

ACTUALIZACIÓN: Si está utilizando Log4j 2, debe eliminar las llamadas a setLevel según la documentación, ya que esto se puede lograr a través de las clases de implementación.

Las llamadas a logger.setLevel () o métodos similares no son compatibles con la API. Las aplicaciones deberían eliminar estos. Se proporciona una funcionalidad equivalente en las clases de implementación de Log4j 2, pero puede dejar la aplicación susceptible a cambios en las partes internas de Log4j 2.

Archivo Watchdog

Log4j puede ver el archivo log4j.xml para cambios de configuración. Si cambia el archivo log4j, log4j actualizará automáticamente los niveles de registro de acuerdo con sus cambios. Consulte la documentación de org.apache.log4j.xml.DOMConfigurator.configureAndWatch(String,long ) para obtener detalles. El tiempo de espera predeterminado entre las comprobaciones es de 60 segundos. Estos cambios serían persistentes, ya que cambia directamente el archivo de configuración en el sistema de archivos. Todo lo que necesita hacer es invocar DOMConfigurator.configureAndWatch () una vez.

Precaución: el método configureAndWatch no es seguro para su uso en entornos J2EE debido a una fuga de hilo

JMX

Otra forma de establecer el nivel de registro (o la reconfiguración en general) log4j es mediante el uso de JMX. Log4j registra sus registradores como JMX MBeans. Usando los servidores de aplicaciones de las consolas MBeanServer (o Jconsole.exe de JDK) puede reconfigurar cada registrador individual. Estos cambios no son persistentes y se restablecerán a la configuración establecida en el archivo de configuración después de reiniciar la aplicación (servidor).

Salir adelante por sí mismo

Según lo describe Aaron, puede establecer el nivel de registro mediante progtwigción. Puede implementarlo en su aplicación de la forma en que le gustaría que sucediera. Por ejemplo, podría tener una GUI donde el usuario o administrador cambie el nivel de registro y luego setLevel() métodos setLevel() en el registrador. Si persiste la configuración en alguna parte o no depende de usted.

Log4j2 se puede configurar para actualizar su configuración escaneando el archivo log4j 2 .xml (o equivalente) a intervalos determinados. Simplemente agregue el parámetro ” monitorInterval ” a su etiqueta de configuración. Consulte la línea 2 del ejemplo de archivo log4j 2 .xml, que le indica a log4j que vuelva a analizar su configuración si han pasado más de 5 segundos desde el último evento de registro.

        ...         

Hice esto para cambiar dinámicamente el nivel de registro log4j y funcionó para mí, no he enviado ningún documento. Utilicé este valor de propiedad del sistema para establecer mi nombre de archivo de registro. Usé la misma técnica para establecer el nivel de registro también, y funcionó

pasó esto como parámetro de JVM (yo uso Java 1.7)

 java -Dlogging.level=DEBUG -cp xxxxxx.jar xxxxx.java 

en el archivo log4j.properties, agregué esta entrada

 log4j.rootLogger=${logging.level},file,stdout 

Lo intenté

  java -Dlogging.level=DEBUG -cp xxxxxx.jar xxxxx.java java -Dlogging.level=INFO-cp xxxxxx.jar xxxxx.java java -Dlogging.level=OFF -cp xxxxxx.jar xxxxx.java 

Todo funcionó. ¡espero que esto ayude!

Tengo estas siguientes dependencias en mi pom.xml

  log4j log4j 1.2.17   log4j apache-log4j-extras 1.2.17  

Con log4j 1.x encuentro que la mejor manera es usar un DOMConfigurator para enviar uno de un conjunto predefinido de configuraciones de registro XML (por ejemplo, una para un uso normal y otra para la depuración).

Hacer uso de estos se puede hacer con algo como esto:

  public static void reconfigurePredefined(String newLoggerConfigName) { String name = newLoggerConfigName.toLowerCase(); if ("default".equals(name)) { name = "log4j.xml"; } else { name = "log4j-" + name + ".xml"; } if (Log4jReconfigurator.class.getResource("/" + name) != null) { String logConfigPath = Log4jReconfigurator.class.getResource("/" + name).getPath(); logger.warn("Using log4j configuration: " + logConfigPath); try (InputStream defaultIs = Log4jReconfigurator.class.getResourceAsStream("/" + name)) { new DOMConfigurator().doConfigure(defaultIs, LogManager.getLoggerRepository()); } catch (IOException e) { logger.error("Failed to reconfigure log4j configuration, could not find file " + logConfigPath + " on the classpath", e); } catch (FactoryConfigurationError e) { logger.error("Failed to reconfigure log4j configuration, could not load file " + logConfigPath, e); } } else { logger.error("Could not find log4j configuration file " + name + ".xml on classpath"); } } 

Simplemente llame a esto con el nombre de configuración apropiado y asegúrese de colocar las plantillas en classpath.

Si desea cambiar el nivel de registro de todos los registradores, use el siguiente método. Esto enumerará todos los registradores y cambiará el nivel de registro al nivel dado. Asegúrese de que NO tiene la propiedad log4j.appender.loggerName.Threshold=DEBUG establecida en su archivo log4j.properties .

 public static void changeLogLevel(Level level) { Enumeration loggers = LogManager.getCurrentLoggers(); while(loggers.hasMoreElements()) { Logger logger = (Logger) loggers.nextElement(); logger.setLevel(level); } } 

Puede usar el siguiente fragmento de código

 ((ch.qos.logback.classic.Logger)LoggerFactory.getLogger(packageName)).setLevel(ch.qos.logback.classic.Level.toLevel(logLevel));