2010-02-18 17 views
21

Come posso ottenere log4j per prelevare un file di proprietà.Come configurare log4j con un file di proprietà

Sto scrivendo un'app desktop Java che desidero utilizzare log4j. Nel mio metodo principale se avere questo:

PropertyConfigurator.configure("log4j.properties"); 

Il file log4j.properties siede nella stessa directory in cui ho aperto il vaso.

Eppure ottengo questo errore:

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

Che cosa sto facendo di sbagliato?

+1

Il file log4j.properties deve trovarsi nella cartella principale dell'applicazione principale (poiché si sta scrivendo un'applicazione desktop). –

risposta

43

Credo che il metodo configure si aspetti un percorso assoluto. In ogni caso, si può anche provare a caricare una proprietà degli oggetti prima:

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

Se il file delle proprietà è nel vaso, allora si potrebbe fare qualcosa di simile:

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

È possibile che questo presuppone che il log4j .properties è nella cartella principale del file jar.

+0

Un percorso assoluto nel jar o nel filesystem? – Dan

+0

Un percorso assoluto nel filesystem. Utilizza getResource se il file si trova nel barattolo. – kgiannakakis

+0

Hai un esempio di come farlo? – Dan

-1

È possibile abilitare la registrazione interna di log4j definendo la variabile 'log4j.debug'.

+1

Non risponde alla domanda originale. – Achow

+0

@anirbanchowdhury No, ma è una valida alternativa che dovrebbe essere documentata. Ma continua a sprecare la tua reputazione in downgrade ... hai solo un paio di centinaia di milioni per andare! – Jeach

+0

Non è personale, ma capisco completamente perché la gente non commenta dopo il downgrade. :) – Achow

1

Ho questo codice nella mia domanda oggi

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

Il percorso relativo è dalla directory di lavoro della JVM (dove la JVM si avvia).

12

Quando si utilizza PropertyConfigurator.configure (String nomefileconfig), sono la seguente operazione nella libreria log4j.

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

Fallisce nella lettura perché sembra per "Log4j.properties" dalla directory corrente in cui viene eseguita l'applicazione.

Come circa il modo in cui modifica la parte di lettura del file delle proprietà come segue e inserisce "log4j.properties" nella directory in cui è impostato CLASSPATH.

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

Un altro metodo di mettere "Log4j.properties" nel file jar esiste.

jar xvf [YourApplication].jar log4j.properties 
0

Credo che la directory log4j.properties debba trovarsi nel classpath java. Nel tuo caso l'aggiunta del CWD al classpath dovrebbe essere.

0

Dal argomenti JVM sono finalmente passati al programma Java come variabili di sistema, è possibile utilizzare questo codice all'inizio del vostro punto di esecuzione per modificare la proprietà e hanno log4j leggere la proprietà appena impostato nelle proprietà di 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

Questa è una modifica della risposta di @kgiannakakis: Il codice originale è errato perché non chiude correttamente InputStream dopo che è stato chiamato Properties.load(InputStream). Dal Javadocs: The specified stream remains open after this method returns.

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

Credo che il configure il metodo si aspetta un percorso assoluto. In ogni caso, si può anche provare a caricare una proprietà degli oggetti prima:

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); 

Se il file delle proprietà è nel vaso, allora si potrebbe fare qualcosa di simile:

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); 

È possibile che questo presuppone che il log4j .properties è nella cartella principale del file jar.

5

just set -Dlog4j.configuration = file: log4j.properties ha funzionato per me.

log4j quindi cerca il file log4j.properties nella directory di lavoro corrente dell'applicazione.

Ricordate che log4j.configuration è una specifica URL, in modo da aggiungere 'file:' davanti al nome del file log4j.properties se si vuole fare riferimento a un file regolare sul filesystem, cioè un file non sul classpath !

Inizialmente ho specificato -Dlog4j.configuration = log4j.properties. Tuttavia, funziona solo se log4j.properties si trova sul classpath. Quando ho copiato log4j.properties in main/resources nel mio progetto e ho ricostruito in modo tale che fosse copiato nella directory di destinazione (progetto maven) anche questo funzionava (o potevi impacchettare i tuoi log4j.properties nei tuoi jar di progetto, ma non consentire all'utente di modificare la configurazione del logger!).

Problemi correlati