2010-04-26 36 views
23

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:Dónde/cómo busca log4j un archivo log4j.properties?

Creé un archivo log4j.properties con un appender personalizado y un nivel de registro y lo coloqué 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?

Respuesta

7

Argh. Descubrí que el problema era que eclipse había importado la clase incorrecta Logger. 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.

+0

ha, las malas importaciones que no se detectan en tiempo de compilación son un dolor ... :-) – leonbloy

+0

Lo hago todo el tiempo. – justkt

7

Puede habilitar la depuración interna 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 el URL al archivo de configuración con la propiedad del sistema log4j.configuration.

Ver también: this question.

2

log4j.properties debería 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, ¿no?)

34

Para aquellos que no han RTFM, mira bajo el título Default Initialization Procedure, donde encontrará lo siguiente:

El algoritmo exacto inicialización por defecto se define como sigue:

  1. Ajuste de la log4j.defaultInitOverride propiedad del sistema a cualquier otro valor que no sea "false" hará que log4j omita el procedimiento de inicialización predeterminado (este procedimiento).
  2. 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 sistema log4j.configuration . En caso de que la propiedad del sistema log4j.configuration sea no definida, establezca el recurso de la variable de cadena en valor predeterminado "log4j.properties".
  3. Intenta convertir la variable de recurso en una URL.
  4. Si la variable de recursos no puede ser convertido a una dirección URL, por ejemplo debido a un MalformedURLException, a continuación, busque el recurso de la ruta de clases llamando org.apache.log4j.helpers.Loader.getResource (recursos, 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.
  5. Si no se pudo encontrar la URL, cancele la inicialización predeterminada. De lo contrario, configure log4j desde la URL. El PropertyConfigurator se utilizará para analizar la URL para configurar log4j a menos que la URL termina con la extensión ".xml", en cuyo caso se utilizará el DOMConfigurator . Puede opcionalmente especificar un configurador personalizado. El valor de la propiedad del sistema log4j.configuratorClass se toma como el nombre de clase totalmente calificado de su configurador personalizado. El configurador personalizado que especifique debe implementar la interfaz Configurator.
+0

A veces solo tienes que RTFM. Aunque es un poco complicado, esta información es autoritativa y muy explícita y me ayudó a resolver un problema. +1! –

+6

El FM está un poco desactualizado. Al buscar el origen de 'LogManager.java' en 1.2.17, de manera predeterminada busca' log4j.xml' (no mencionado en ese documento) antes de buscar 'log4j.properties', y la constante que define el archivo de propiedades es declarado '@ deprecated' (aunque parece que solo previene el uso externo de la constante). – bacar

1

Sé que esto es un par de meses, pero siento la necesidad de señalar que la carpeta scr no es "copia" a la carpeta bin, ni es parte de la ruta de clases en tiempo de ejecución. ... (la ruta de compilación no es classpath en tiempo de ejecución!). 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 quiero señalar esto ya que estos subprocesos también suelen leerlos los programadores más jóvenes, y siempre me siento frustrado porque la mayoría de ellos no captan la fineza del classpath de Java y, por lo tanto, cometen errores evitables contra eso.

4

El problema puede estar en classpath, si se definió classpath.

La razón de que no se estaba cargando (en mi caso): No fue un archivo en conflicto log4j.properties en una de mis frascos, y fue sobrecargar el uno en mi classpath.

En resumen, si su archivo log4j.properties no se está cargando, puede haber otro en otro lugar que lo sobrescriba.

Sólo 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.

Cuestiones relacionadas