java - logger - org/apache/logging/log4j/logmanager
¿Dónde/cómo busca log4j un archivo log4j.properties? (6)
Estoy probando log4j en una aplicación de prueba simple. Creo un nuevo proyecto de Java en eclipse y agrego log4j JAR (v1.2.16) a mi ruta de compilación. Luego creo una clase simple que imprime Hello World. Luego utilizo la clase Log4j Logger
para registrar un mensaje de información. Cuando ejecuto la aplicación, veo el mensaje de registro, utilizando lo que supongo que es el apéndice y el diseño por defecto. Estupendo. Lo que estoy teniendo problemas es agregar mi propia configuración. Esto es lo que hice:
Creó un archivo log4j.properties con un apéndice y un nivel de registro personalizados y lo colocó en la carpeta src (que al compilarse se copia a la carpeta bin). Ejecuta la aplicación, sin cambios.
Intento agregar PropertyConfigurator.configure("log4j.properties")
. Ejecuta la aplicación, sin cambios. Sin errores, pero sin cambios.
¿Qué debo hacer para que log4j cargue mi archivo de configuración?
Argh. Descubrí que el problema era que el eclipse había importado la clase Logger
equivocada. Había importado java.util.logging.Logger, que por supuesto tiene su propia configuración que es diferente de log4j. Oh, bueno, espero que alguien más haga esto y lo solucione leyendo esta pregunta.
log4j.properties
debe estar en su classpath. La "carpeta src" que se copia a la "carpeta bin" (supongo que estás hablando de una configuración de Eclipse aquí), normalmente pertenece a tu classpath, por lo que debe encontrarse (¿la estás colocando en la parte superior de la "src"? "carpeta, ¿verdad?)
Sé que esto tiene un par de meses, pero siento la necesidad de señalar que la carpeta scr no está "copiada" a la carpeta bin, ni es parte de su classpath en tiempo de ejecución ... (la ruta de compilación no es runtime classpath!). Eclipse compila los archivos fuente en la carpeta src a la carpeta bin (o lo que quieras). Es la carpeta bin que forma parte de su classpath en tiempo de ejecución.
Solo quería señalar esto ya que estos subprocesos también suelen leerlos los programadores más jóvenes, y siempre me siento frustrado de que la mayoría de ellos no entiendan la delicadeza del classpath de Java y, por lo tanto, cometan errores evitables en su contra.
El problema puede estar en el classpath
, si el classpath
fue definido.
El motivo por el que no estaba cargando (en mi caso): había un archivo conflictivo de log4j.properties
en uno de mis log4j.properties
, y estaba sobrecargando el que estaba en mi classpath
.
En resumen, si su archivo log4j.properties
no se está cargando, puede haber otro en otro lugar que lo sobrescriba.
Solo pensé en tirar esto también, en caso de que alguien más se encuentre con esto. Acabo de pasar las últimas 5 horas tratando de averiguar por qué mi log4j.properties
predeterminado no se carga.
Para aquellos que no tienen RTFM, busque bajo el encabezado Procedimiento de Inicialización Predeterminada , donde encontrará lo siguiente:
El algoritmo de inicialización predeterminado exacto se define de la siguiente manera:
- Establecer la propiedad del sistema
log4j.defaultInitOverride
en cualquier otro valor que no sea "false
" hará que log4j omita el procedimiento de inicialización predeterminado (este procedimiento).- Establezca la variable de cadena de recursos en el valor de la propiedad del sistema
log4j.configuration
. La forma preferida de especificar el archivo de inicialización predeterminado es a través de la propiedad del sistemalog4j.configuration
. En caso de que la propiedad del sistema log4j.configuration no esté definida, entonces establezca el recurso de variable de cadena en su valor predeterminado "log4j.properties
".- Intenta convertir la variable de recurso en una URL.
- Si la variable de recurso no se puede convertir a una URL, por ejemplo, debido a una excepción MalformedURLException, entonces busque el recurso de la ruta de clase llamando a org.apache.log4j.helpers.Loader.getResource (resource, Logger.class) que devuelve una URL . Tenga en cuenta que la cadena "
log4j.properties
" constituye una URL mal formada. Consulte Loader.getResource (java.lang.String) para ver la lista de ubicaciones buscadas.- Si no se puede encontrar una URL, cancele la inicialización predeterminada. De lo contrario, configure log4j desde la URL. El PropertyConfigurator se usará para analizar la URL para configurar log4j a menos que la URL termine con la extensión "
.xml
", en cuyo caso se utilizará DOMConfigurator . Puede opcionalmente especificar un configurador personalizado. El valor de la propiedad del sistemalog4j.configuratorClass
se toma como el nombre de clase totalmente calificado de su configurador personalizado. El configurador personalizado que especifique debe implementar la interfaz delConfigurator
.
Puede habilitar la depuración interna de log4j configurando la propiedad del sistema log4j.debug
. Entre otras cosas, esto hará que log4j muestre cómo se está configurando.
Puede intentar establecer explícitamente la URL en el archivo de configuración con la propiedad del sistema log4j.configuration
.
Ver también: esta pregunta .