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


78

Pregunta

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


Antecedentes

Tengo una relación de amor y odio con log4j. En los buenos tiempos, es genial, pero cuando no funciona, 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 procedimiento de inicialización predeterminado definido en el manual. Aún así, parece que, cada pocas semanas, se interrumpe el registro y dedico mucho tiempo a resolver el problema.

Esta vez, está muy roto. Cada declaración de registro en todas partes se descarga en 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 alguna otra configuración. Nada obvio ha cambiado. Mi única suposición es que algunas dependencias han cambiado y sospecho que Maven ha descargado un JAR malvado que lo está rompiendo todo.

Si pudiera averiguar qué archivo de configuración Log4J decidió usar al inicio , podría abordar este y la mayoría de los otros problemas fácilmente.


Resumen

¿Hay alguna forma de decirle a Log4J que imprima qué archivo usó para la configuración? Alternativamente, ¿hay alguna manera 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)?


1
El fondo parece un problema de encuadernación múltiple. De slf4j.org/codes.html#multiple_bindings : La advertencia emitida por SLF4J es solo eso, una advertencia. Incluso cuando hay varios enlaces presentes, SLF4J seleccionará un marco / implementación de registro y se enlazará con él. La JVM determina la forma en que SLF4J elige un enlace y, para todos los fines prácticos, debe considerarse aleatoria.
Newur

Respuestas:


82

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

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

Log4j luego generará algo como lo siguiente:

log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@1f7182c1.  
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, consulte el manual y las preguntas frecuentes .


6
Por alguna razón, establecer esta bandera no tiene ningún efecto en mi proyecto, tal vez porque usa SLF4J. Traté de saber por qué, pero finalmente terminé revisando manualmente 21 archivos de configuración que están allí;)
Línea

2
Tenga en cuenta que en log4j2, la propiedad ha cambiado a log4j2.debug, y es posible que también deba establecer -Dorg.apache.logging.log4j.simplelog.StatusLogger.level = TRACE si está intentando depurar problemas para encontrar el archivo de configuración.
user2163960

7

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());

1
Por un lado, esto era exactamente lo que estaba buscando, por otro lado, cambiar el archivo de configuración de la salida no tuvo ningún efecto. Por lo tanto, uno debe estar realmente seguro de que Log4J2 se usa realmente. Tuve un problema de enlace múltiple, como se describe aquí slf4j.org/codes.html#multiple_bindings , por lo que el registrador real era slf4j-simple.
newur

También estaba usando el depurador y establecí un punto de interrupción en el constructor de org.apache.logging.log4j.util.PropertiesUtil. Aquí es donde se encuentran y cargan los archivos denominados log4j2.component.properties. Descubrí que se cargaron dos archivos, primero desde target / test-classes y segundo desde target / classes y la propiedad de este último estaba sobrescribiendo la propiedad del primero.
rychu

2

El equivalente de log4j 2 para esto se establece <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 log4j2. De forma predeterminada, el nivel del registrador de estado es WARN, por lo que solo verá 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.levelen TRACE.


5
Pero si está tratando de averiguar qué valor de configuración se está utilizando, agregarlo a un valor de configuración que podría no estar activo no servirá de nada.
Omaha
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.