2010-09-20 13 views
55

Pregunta¿Es posible hacer que log4j muestre qué archivo usó para configurarse?

¿Es posible hacer que la pantalla Log4J la ruta completa del archivo que utiliza para la configuración?


Antecedentes

que tienen una relación de amor-odio con log4j. En los buenos tiempos, es genial, pero cuando no está funcionando, puede ser una de las cosas más difíciles de depurar. Administro todo el registro en nuestra aplicación. Como tal, estoy muy familiarizado con el registro y el default initialization procedure defined in the manual. Aún así, parece que, cada pocas semanas, el registro se interrumpe y gasto mucho tiempo solucionando el problema.

Esta vez, está muy roto. Cada instrucción de registro en todas partes está siendo descargada a la consola y no puedo entender por qué. La misma base de código exacta que usó mis archivos log4j.xml la semana pasada, de repente está usando otra configuración. Nada obvio ha cambiado. Mi única conjetura es que algunas dependencias han cambiado y sospecho que Maven ha descargado un JAR malvado que está rompiendo todo.

Si tan sólo pudiera averiguar qué archivo de configuración Log4J decidió utilizar en el arranque, podría hacer frente a este y muchos otros problemas con facilidad.


Resumen

¿Hay alguna manera de saber Log4J para imprimir qué archivo se utiliza para la configuración? Alternativamente, ¿hay alguna forma de romper una aplicación en ejecución y usar el depurador para responder esta pregunta (tal vez con una expresión o inspeccionando variables)?

Respuesta

61

Sí, simplemente agregue log4j.debug a las variables del sistema JVM. Por ejemplo:

java -Dlog4j.debug -cp ... some.class.name 

Log4J hará algo, entonces una salida como la siguiente:

log4j: Trying to find [log4j.xml] using context classloader [email protected] 
log4j: Using URL [file:/C:/Users/matt/workspace/projectname/target/test-classes/log4j.xml] for automatic log4j configuration. 
log4j: Preferred configurator class: org.apache.log4j.xml.DOMConfigurator 
log4j: System property is :null 
log4j: Standard DocumentBuilderFactory search succeded. 
log4j: DocumentBuilderFactory is: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl 
log4j: debug attribute= "null". 
log4j: Ignoring debug attribute. 
log4j: reset attribute= "false". 
log4j: Threshold ="null". 
... 

para referencia ver the manual y the FAQ.

+0

¡maravilloso! No puedo esperar para intentar esto mañana. – gMale

0

estoy usando Log4J2 y si desea obtener el archivo desde dentro de su programa Java esto funcionó para mí:

LoggerContext lContect = LogManager.getContext(); 
Field f = lContect.getClass().getDeclaredField("configuration"); 
f.setAccessible(true); 
XmlConfiguration iWantThis = (XmlConfiguration) f.get(lContect); 
System.out.println("Config File: " + iWantThis.getName()); 
0

El log4j 2 equivalente para esto es para establecer <Configuration status="trace"> en el archivo de configuración. Esto mostrará la ubicación desde donde se carga el archivo de configuración log4j2, así como otros detalles internos del proceso de configuración de log4j2. Por defecto, el nivel del registrador de estado es WARN, por lo que solo verá las notificaciones cuando haya un problema.

Si el archivo de configuración no se encuentra correctamente, aún puede habilitar el registro de estado interno de log4j2 estableciendo la propiedad del sistema org.apache.logging.log4j.simplelog.StatusLogger.level en TRACE.

+2

Pero si está tratando de averiguar qué valor de configuración se está utilizando, ¡agregar eso a un valor de configuración que podría no estar activo no servirá de nada! – Omaha

Cuestiones relacionadas