2010-02-18 18 views
21

¿Cómo puedo obtener log4j para recoger un archivo de propiedades.Cómo configurar log4j con un archivo de propiedades

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

PropertyConfigurator.configure("log4j.properties"); 

El archivo log4j.properties se encuentra en el mismo directorio al abrir el frasco.

Sin embargo, me sale este error:

log4j:ERROR Could not read configuration file [log4j.properties]. java.io.FileNotFoundException: log4j.properties (The system cannot find the file specified)

¿Qué estoy haciendo mal?

+1

El archivo log4j.properties debe estar en la carpeta raíz de su aplicación principal (ya que está escribiendo una aplicación de escritorio). –

Respuesta

43

Creo que el método de configuración espera una ruta absoluta. De todos modos, es posible que también intenta cargar un Propiedades del objeto en primer lugar:

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

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

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

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

+0

¿Una ruta absoluta en el jar o en el sistema de archivos? – Dan

+0

Una ruta absoluta en el sistema de archivos. Use getResource si el archivo está en el contenedor. – kgiannakakis

+0

¿Tienes un ejemplo de cómo hacerlo? – Dan

-1

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

+1

No responde la pregunta original. – Achow

+0

@anirbanchowdhury No, pero es una alternativa valiosa que debe documentarse. Pero sigue desperdiciando tu reputación en rebajas ... ¡solo te quedan unos cientos de millones! – Jeach

+0

No es personal, pero entiendo completamente por qué las personas no hacen comentarios después de la degradación. :) – Achow

1

tengo este código en mi solicitud hoy

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

La ruta relativa es del directorio de trabajo de la máquina virtual Java (donde comienza la JVM).

12

Cuando se utiliza PropertyConfigurator.configure (cadena configFilename), que 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) { 
... 

se produce un error en la lectura porque busca "Log4j.properties" desde el 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 
0

Creo que el directorio log4j.properties debe estar en el classpath de java. En su caso, agregue el CWD al classpath si funciona.

0

Desde argumentos de JVM son finalmente pasaban a su programa java como variables del sistema, puede utilizar este código al principio de su punto de ejecución para editar la propiedad y tienen log4j leer 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(); 
    } 
3

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 llamar al Properties.load(InputStream). Desde el Javadocs: The specified stream remains open after this method returns.

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

Creo que la configure método espera una ruta absoluta. De todos modos, es posible que también intenta cargar un Propiedades del objeto en primer lugar:

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 frasco, entonces usted 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 el log4j .properties está en la carpeta raíz del archivo jar.

5

acaba de establecer -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 URL, por lo que añadir 'file:' delante de su nombre log4j.properties si desea hacer referencia a un archivo normal en el sistema de archivos, es decir, un archivo no en la ruta de clase !

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!).

Cuestiones relacionadas