Come configurare log4j con un file di proprietà

Come posso ottenere log4j per prelevare un file delle proprietà.

Sto scrivendo un’app desktop Java che voglio usare log4j. Nel mio metodo principale se ho questo:

PropertyConfigurator.configure("log4j.properties"); 

Il file log4j.properties si trova nella stessa directory quando apro Jar.

Eppure ottengo questo errore:

log4j: ERRORE Imansible leggere il file di configurazione [log4j.properties]. java.io.FileNotFoundException: log4j.properties (Il sistema non riesce a trovare il file specificato)

Che cosa sto facendo di sbagliato?

Credo che il metodo configure si aspetti un percorso assoluto. In ogni caso, puoi anche provare a caricare prima un object Properties:

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

Se il file delle proprietà è nel jar, puoi fare qualcosa del genere:

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

Quanto sopra presuppone che log4j.properties si trovi nella cartella principale del file jar.

Quando si utilizza PropertyConfigurator.configure ( String configFilename ), sono le seguenti operazioni nella libreria log4j.

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

Non riesce a leggere perché cerca “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); 

Esiste un altro metodo per inserire “Log4j.properties” nel file jar.

 jar xvf [YourApplication].jar log4j.properties 

basta impostare -Dlog4j.configuration = file: log4j.properties ha funzionato per me.

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

Ricorda che log4j.configuration è una specifica URL , quindi aggiungi ‘file:’ davanti al tuo nome file log4j.properties se vuoi 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!).

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

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

Credo che il metodo configure si aspetti un percorso assoluto. In ogni caso, puoi anche provare a caricare prima un object Properties:

 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 jar, puoi fare qualcosa del genere:

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

Quanto sopra presuppone che log4j.properties si trovi nella cartella principale del file jar.

Ho questo codice nella mia applicazione oggi

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

Il percorso relativo proviene dalla directory di lavoro della JVM (dove inizia JVM).

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

Poiché gli argomenti JVM vengono infine passati al tuo programma java come variabili di sistema, puoi usare questo codice all’inizio del punto di esecuzione per modificare la proprietà e fare in modo che log4j legga la proprietà che hai 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 (MalformsdURLException e) { e.printStackTrace(); } 

È ansible abilitare la registrazione interna di log4j definendo la variabile ‘ log4j.debug ‘.