Cómo configurar log4j con un archivo de propiedades

¿Cómo obtengo log4j para recoger un archivo de propiedades?

Estoy escribiendo una aplicación de escritorio Java que quiero usar log4j. En mi método principal si tienes esto:

PropertyConfigurator.configure("log4j.properties"); 

El archivo log4j.properties se encuentra en el mismo directorio cuando abro el Jar.

Sin embargo, recibo este error:

log4j: ERROR No se pudo leer el archivo de configuración [log4j.properties]. java.io.FileNotFoundException: log4j.properties (El sistema no puede encontrar el archivo especificado)

¿Qué estoy haciendo mal?

Creo que el método de configuración espera una ruta absoluta. De todos modos, también puedes intentar cargar un objeto Properties primero:

 Properties props = new Properties(); props.load(new FileInputStream("log4j.properties")); PropertyConfigurator.configure(props); 

Si el archivo de propiedades está en el contenedor, entonces podría hacer algo como esto:

 Properties props = new Properties(); props.load(getClass().getResourceAsStream("/log4j.properties")); PropertyConfigurator.configure(props); 

Lo anterior supone que log4j.properties está en la carpeta raíz del archivo jar.

Cuando utiliza PropertyConfigurator.configure ( String configFilename ), son la siguiente operación en la biblioteca log4j.

 Properties props = new Properties(); FileInputStream istream = null; try { istream = new FileInputStream(configFileName); props.load(istream); istream.close(); } catch (Exception e) { ... 

Falla en la lectura porque busca “Log4j.properties” del directorio actual donde se ejecuta la aplicación.

¿Qué tal la forma en que cambia la parte de lectura del archivo de propiedades de la siguiente manera, y pone “log4j.properties” en el directorio en el que se establece CLASSPATH?

 ClassLoader loader = Thread.currentThread().getContextClassLoader(); URL url = loader.getResource("log4j.properties"); PropertyConfigurator.configure(url); 

Existe otro método para poner “Log4j.properties” en el archivo jar.

 jar xvf [YourApplication].jar log4j.properties 

simplemente configuró -Dlog4j.configuration = file: log4j.properties funcionó para mí.

log4j busca el archivo log4j.properties en el directorio de trabajo actual de la aplicación.

Recuerde que log4j.configuration es una especificación de URL , así que agregue ‘file:’ delante de su nombre de archivo log4j.properties si desea hacer referencia a un archivo normal en el sistema de archivos, es decir, ¡un archivo que no está en classpath!

Inicialmente especifiqué -Dlog4j.configuration = log4j.properties. Sin embargo, eso solo funciona si log4j.properties está en classpath. Cuando copié log4j.properties en main / resources en mi proyecto y lo reconstruí para que se copiara en el directorio de destino (proyecto maven), esto también funcionó (o podría empaquetar log4j.properties en los archivos de proyecto, pero eso no permitir al usuario editar la configuración del registrador!).

Esta es una edición de la respuesta de @kgiannakakis: el código original es incorrecto porque no cierra correctamente el InputStream después de que se llama a Properties.load(InputStream) . Desde los Javadocs: The specified stream remains open after this method returns.

=============================

Creo que el método de configuración espera una ruta absoluta. De todos modos, también puedes intentar cargar un objeto Properties primero:

 Properties props = new Properties(); InputStream is = new FileInputStream("log4j.properties"); try { props.load(is); } finally { try { is.close(); } catch (Exception e) { // ignore this exception } } PropertyConfigurator.configure(props); 

Si el archivo de propiedades está en el contenedor, entonces podría hacer algo como esto:

 Properties props = new Properties(); InputStream is = getClass().getResourceAsStream("/log4j.properties"); try { props.load(is); } finally { try { is.close(); } catch (Exception e) { // ignore this exception } } PropertyConfigurator.configure(props); 

Lo anterior supone que log4j.properties está en la carpeta raíz del archivo jar.

Tengo este código en mi aplicación de hoy

 File log4jfile = new File("./conf/log4j.properties"); PropertyConfigurator.configure(log4jfile.getAbsolutePath()); 

La ruta relativa es desde el directorio de trabajo de la JVM (donde se inicia la JVM).

Creo que el directorio log4j.properties necesita estar en el classpath de java. En su caso, agregar el CWD al classpath debería funcionar.

Como los argumentos de JVM finalmente se pasan a su progtwig Java como variables del sistema, puede usar este código al comienzo de su punto de ejecución para editar la propiedad y hacer que log4j lea la propiedad que acaba de establecer en las propiedades del sistema

 try { System.setProperty("log4j.configuration", new File(System.getProperty("user.dir")+File.separator+"conf"+File.separator+"log4j.properties").toURI().toURL().toString()); } catch (MalformedURLException e) { e.printStackTrace(); } 

Puede habilitar el registro interno de log4j definiendo la variable ‘ log4j.debug ‘.