2012-01-18 15 views
11

Ho fatto del mio meglio per configurare eclipse e la mia applicazione Java per utilizzare un file log4j.properties. Tuttavia, sembra che non stia utilizzando il file delle proprietà e non sono sicuro del perché.Applicazione Java: utilizzo di Log4j per lavorare all'interno dell'ambiente Eclipse

Biblioteche: slf4j-api-1.6.1, SLF4J-jdk14-1.6.1

All'interno dell'applicazione la registrazione funziona bene. Sono in grado di stampare informazioni, avvisi ed errori nella console di Eclipse.

Quello che vorrei essere in grado di fare è modificare il livello del registro per eseguire il debug e stampare tutti i messaggi di registrazione sia sulla console sia su un file di registro.

ho creato un file log4j.properties che assomiglia a questo:

log4j.rootLogger=DEBUG,console,file 
log4j.rootCategory=DEBUG, R, O 

# Stdout 
log4j.appender.O=org.apache.log4j.ConsoleAppender 

# File 
log4j.appender.R=org.apache.log4j.RollingFileAppender 
log4j.appender.R.File=log4j.log 

# Control the maximum log file size 
log4j.appender.R.MaxFileSize=100KB 

# Archive log files (one backup file here) 
log4j.appender.R.MaxBackupIndex=5 
log4j.appender.file.File=checkLog.log 
log4j.appender.file.threshold=DEBUG 

log4j.appender.R.layout=org.apache.log4j.PatternLayout 
log4j.appender.O.layout=org.apache.log4j.PatternLayout 

log4j.appender.R.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n 
log4j.appender.O.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n 

La mia struttura directory simile a questa:

My Project 
--src/ 
----MYProject/ 
------*.java 
--bin/ 
----MYProject/ 
------*.class 
--log4j/ 
----log4j.properties 

in Eclipse sono andato a: Run Configurazioni -> Classpath (scheda) -> tasto destro del mouse su "voci utente" -> aggiunto "log4j" come nuova cartella "e salvato

Quindi nel mio codice chiamo il logger come questo (sa Codice mple per dimostrare il mio approccio in modo da può avere errori di sintassi):

package MYProject; 
import org.slf4j.LoggerFactory; 

public class MyClass{ 

    final org.slf4j.Logger test_logger = LoggerFactory.getLogger(MyClass.class); 

    public MyClass(){} 

    public someMethod(){ 
    test_logger.debug("Some Debug"); 
    test_logger.info("Some Info"); 
    test_logger.warn("Some Warning"); 
    test_logger.error("An Error"); 
    } 

} 

Ho poi chiamo someMethod e stampe INFO, WARN, ERROR alla console eclissi. Non stamperà DEBUG e non stamperà su un file.

Apprezzerei qualsiasi suggerimento su quello che potrei fare storto.

risposta

14

Ci può essere un altro file o log4j.propertieslog4j.xml nel classpath davanti alla vostra log4j.properties. Apri la configurazione di esecuzione per il tuo progetto e aggiungi -Dlog4j.debug=true come argomento VM per il tuo progetto. Questo istruirà log4j a stampare molte informazioni aggiuntive sulla console, incluso il file di configurazione che sta utilizzando.

+1

Ho giocato con entrambi i commenti e le apine e questo è quello che ho capito. Non riesco ad aggiungere PropertyConfigurator con la mia configurazione corrente perché è una proprietà della libreria log4j e non una parte della libreria slf4j-jdk14 (legatore log4j di slf4j come la comprendo io). L'impostazione dei parametri VM su true non restituisce alcun debug aggiuntivo. – Bryce

+0

Se faccio riferimento alla libreria log4j effettiva oltre a slf4j-jdk14, inizio a ricevere l'output di debug. Aggiungendo semplicemente il riferimento, il mio file log4j.properties inizia a funzionare. Questo sembrerebbe ottenere circa il 90% di quello di cui ho bisogno. Ciò aumenta il debug ma i comandi che stampo nella classe data nel post iniziale non vengono più stampati (test_logger.debug, test_logger.info, ecc.). Penso che questo sia dovuto al fatto che la libreria log4j che ho aggiunto sta sovrascrivendo org.slf4j.Logger che stavo usando in precedenza. Sono un po 'confuso su come far funzionare queste due librerie meglio insieme, qualche suggerimento? – Bryce

+1

slf4j è solo una facciata per la registrazione, è comunque necessario aggiungere la libreria di registrazione effettiva (log4j nel tuo caso) al classpath. Vedi questo link: http://slf4j.org/manual.html#binding –

2

È necessario indicare al codice per utilizzare il file delle proprietà. Prima di qualsiasi registrazione è fatto si prega di mettere

PropertyConfigurator.configure("log4j/log4j.properties"); 
3

Se si utilizza la facciata di registrazione slf4j, allora avete bisogno di specificare esattamente uno registrazione backend includendo il file jar corrispondente per questo backend. Nel tuo caso, hai installato slf4j-jdk14-x.x.x.jar sul classpath, che è solo un backend di logger generico.

Per poter utilizzare il log4j backend, è necessario rimuovere slf4j-jdk14-x.x.x.jar e sostituirlo con slf4j-log4j12-x.x.x.jar. Se non lo rimuovi, slf4j deve scegliere un solo backend jar e probabilmente non quello che vuoi.

Ovviamente è necessario anche il file log4j-x.x.x.jar sul percorso di classe.

Una volta che questi vasi sono posizionati correttamente, il parametro VM di -Dlog4j.debug funzionerà effettivamente e sarà utile nel debug da cui provengono le configurazioni di registrazione.

0

Si potrebbe avere una vecchia versione nella directory di destinazione. Pulisci il progetto e riprova.

Oltre a ciò, è necessario assicurarsi che si aggiornare il progetto eclisse se non è stato aggiunto log4j.properties tramite eclipse.

0

elimina jre (Libreria di sistema JRE) del progetto nella scheda Proprietà/percorso del progetto del percorso e imposta nuovamente jre!

+0

Potresti per favore elaborare più la tua risposta aggiungendo un po 'più di descrizione della soluzione che fornisci? – abarisone

Problemi correlati