2010-12-11 12 views
12

tengo un problema, quiero cambiar el nivel de registro de log4j en el tiempo de ejecución, he intentado muchas cosas con el archivo log4j.properties, también he intentado escribir un código que después de un tiempo particular lee nuevamente el archivo de propiedades y configura nuevamente el registrador.podemos cambiar el nivel de registro de log4j en el tiempo de ejecución

pero el problema es que quiero cambiar el nivel de registro de depuración para una llamada a la API, y luego, cuando se haya completado la llamada, el registrador debe cambiar de nuevo al valor anterior ..

por favor ayuda ..

Respuesta

16

Llamar al método Logger.setLevel con el Level deseado puede alterar el nivel de salida de Logger en tiempo de ejecución.

El siguiente es un ejemplo que demuestra su uso:

Logger logger = Logger.getLogger("myLogger"); 
logger.addAppender(new ConsoleAppender(new SimpleLayout())); 

System.out.println("*** The current level will be INFO"); 

logger.setLevel(Level.INFO); 
logger.warn("Only INFO and higher will appear"); 
logger.info("Only INFO and higher will appear"); 
logger.debug("Only INFO and higher will appear"); 

System.out.println("*** Changing level to DEBUG"); 

// remember the previous level 
Level previousLevel = logger.getLevel(); 

logger.setLevel(Level.DEBUG); 
logger.warn("DEBUG and higher will appear"); 
logger.info("DEBUG and higher will appear"); 
logger.debug("DEBUG and higher will appear"); 

System.out.println("*** Changing level back to previous level"); 

// revert to previous level 
logger.setLevel(previousLevel); 
logger.warn("Only INFO and higher will appear"); 
logger.info("Only INFO and higher will appear"); 
logger.debug("Only INFO and higher will appear"); 

Las salidas anteriores:

*** The current level will be INFO 
WARN - Only INFO and higher will appear 
INFO - Only INFO and higher will appear 
*** Changing level to DEBUG 
WARN - DEBUG and higher will appear 
INFO - DEBUG and higher will appear 
DEBUG - DEBUG and higher will appear 
*** Changing level back to previous level 
WARN - Only INFO and higher will appear 
INFO - Only INFO and higher will appear 

Lo anterior demuestra cómo cambiar el nivel de uno Logger llamado myLogger, pero si los niveles de todos los registradores en el repositorio actual debe cambiarse, entonces el método setLevel en el registrador de raíz obtenido por Logger.getRootLogger sho Debería llamarse para cambiar los niveles en todos los registradores secundarios.

8

El nivel de registro de un registrador se puede cambiar llamando al setLevel como se describe en @coobird. Sin embargo, hay una trampa!

Cuando llame al getLogger(name), la biblioteca de registro le devolverá un objeto existente Logger si es posible. Si dos o más hilos solicitan un registrador con el mismo nombre, obtendrán el mismo objeto. Si uno de los hilos llama al setLevel, esto cambiará el nivel del registrador para todos los demás. Eso puede llevar a un comportamiento inesperado.

Si realmente necesita hacer este tipo de cosas, un mejor enfoque sería crear un registrador con un nombre diferente para el caso en que desea iniciar sesión en un nivel diferente.

Sin embargo, no estoy convencido de la sabiduría de la aplicación llamando al setLevel en absoluto. El método setLevel se trata de filtrar los mensajes de registro, y no debe arrebatar el control del filtrado de registro lejos del usuario/implementador.

1

Creo que tiene sentido llamar al setLevel si un servidor tiene un hilo "Controlador". De esta forma, puede cambiar dinámicamente el nivel de registro en el tiempo de ejecución para depurar un problema y volver a cambiarlo cuando haya terminado.

Pero no sé qué sucede cuando se llama desde un hilo por separado.

+0

Esto debería ser un comentario, no una respuesta.¡Intenta responder a las preguntas que TU SABES la respuesta para poder hacer comentarios! – durron597

-1

método setLevel está allí sólo para java.util.logging.Logger y no para org.apache.logging.log4j.Logger

Ésta es la forma en que establecemos el nivel de registro de Apache log4j

org.apache.logging.log4j.core.LoggerContext 
ctx = (LoggerContext) LogManager.getContext(false); 
org.apache.logging.log4j.core.config.Configuration 
conf = ctx.getConfiguration(); 
conf.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.DEBUG); 
ctx.updateLoggers(conf); 
Cuestiones relacionadas