2012-08-23 12 views
5

Si mis log4j.properties ve este¿Cómo obtener madereros distintos en log4j?

# General configuration 
log4j.rootLogger = ERROR, ConsoleAppender 

# Appender configuration 
log4j.appender.ConsoleAppender = org.apache.log4j.ConsoleAppender 
log4j.appender.ConsoleAppender.layout = org.apache.log4j.PatternLayout 
log4j.appender.ConsoleAppender.layout.ConversionPattern = %5p (%c) %m%n 
#Other Loggers 
log4j.logger.com.foo=INFO 
log4j.logger.com.foo.Bar=DEBUG 
log4j.logger.org.springframework=INFO 

¿Hay una manera fácil de obtener sólo los registradores com.foo, com.foo.Bar, root y org.springframework. Y no las clases específicas que se han creado y heredar los niveles (IE com.foo.bar.Baz?
Para mis propósitos, quiero crear una página de administración que muestre estos registradores y sus niveles, pero no TODOS los registradores, solo los que se han configurado directamente a través de propiedades. Actualmente, estoy recorriendo la jerarquía principal hasta que encuentro un registrador que tiene un nivel diferente que el primario, pero que puede ocultar algunos registradores configurados si están en la jerarquía y establecer el mismo nivel que algo superior.

+1

Está analizando el archivo de propiedades fuera de la cuestión? –

+0

No, usando log4j programáticamente para descubrir qué registradores se han configurado y no solo heredan de otros registradores. – Kodi

Respuesta

4

Se podría hacer algo como esto En primer lugar obtener todos los registradores desde el gestor de registro:.

Enumeration<Category> loggers = LogManager.getCurrentLoggers(); 

Entonces puede pedir a cada registrador de su nivel:

Level currentLevel = logger.getLevel(); 

currentLevel habrá null si nunca se ha establecido explícitamente. Por lo tanto, si el registrador se estableció en un nivel específico en log4j.properties, obtendrá un valor no nulo. De lo contrario obtendrá un valor de null. El registrador de raíz siempre informa un nivel, por lo que sería un caso especial. De esta forma, no necesitaría analizar el archivo log4j.properties.

El único problema es que si en algún lugar de su código se invoca setLevel() en un registrador, que también informará no nulo y aparecerá en su lista. Esto se debe a que log4j no conoce cómo se configuró el nivel, solo si se configuró en absoluto. Para distinguir estos dos casos, aún necesitaría analizar log4j.properties.

Además, tenga en cuenta que esto solo funciona en los registradores que están actualmente cargados. Por lo tanto, si nunca se cargó com.foo.Bar, no lo verá en su lista, incluso si se menciona explícitamente en log4j.properties. Log4J no sabe acerca de los registradores no existentes que podrían crearse en el futuro. De nuevo, para esto necesitaría analizar log4j.properties.

+4

No hay getCurrentLoggers() en LogManager. Log4j 2.2. –

+1

@MagnoC Correcto, mi respuesta se refiere a [Log4J v1] (https://logging.apache.org/log4j/1.2/apidocs/index.html?org/apache/log4j/LogManager.html). Log4J v2 todavía estaba a dos años de distancia en el momento de la respuesta (lanzado en 2014). –

+0

Ok. Solo me estoy quejando ... Necesito ajustar Log4J en mi propia clase de Logger (para preservar los nombres que necesito para eliminar los JAR de Log4J y crear mis clases con los mismos nombres) y agregar log4J JAR nuevamente. Así que llamo al registrador real desde dentro de mi clase Logger (usando el nombre de clase completo). Ahora puedo habilitar y deshabilitar MI registrador. Cuando está deshabilitado, simplemente no paso cadena de registro a través de registro real. –

Cuestiones relacionadas