mkyong logger example ejemplo java log4j

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



log4j2 ejemplo (3)

El equivalente de log4j 2 para esto es 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 log4j2. De forma predeterminada, el nivel del registrador de estado es WARN, por lo que solo verá notificaciones cuando hay un problema.

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

Pregunta

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

Fondo

Tengo una relación de amor-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. Gestiono todo el logging 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, el registro se rompe y dedico mucho tiempo a resolver el problema.

Esta vez, está severamente roto. Cada declaración de registro individual en todas partes se está volcando 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 otra configuración. Nada obvio ha cambiado. Mi única suposición es que algunas dependencias han cambiado y sospecho que Maven ha descargado algún JAR malvado que 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 manera de decirle a Log4J que imprima qué archivo usó para la configuración? Alternativamente, ¿hay una 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)?


Estoy usando Log4J2 y si desea obtener el archivo desde 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());


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

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

Log4j luego emitirá 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 .