Dopo aver aggiunto log4j alla mia applicazione ottengo il seguente output ogni volta che eseguo la mia applicazione:
pre> log4j:WARN Nessun appender è stato trovato per il logger (slideselector.facedata.FaceDataParser). log4j:WARN Inizializzare correttamente il sistema log4j. Prego, non è stato possibile trovare appenders per il logger (slidesector.facedata.FaceDataParser);
Sembra che questo significhi che manca un file di configurazione. Dove dovrebbe trovarsi questo file di configurazione e qual è un buon contenuto iniziale?
Sto usando il semplice java per sviluppare un'applicazione desktop. Quindi nessun webserver ecc...
Log4j per default cerca un file chiamato log4j.properties o log4j.xml nel classpath. Puoi controllare quale file usa per inizializzarsi impostando le proprietà di sistema come descritto qui (cerca la sezione "Default Initialization Procedure").
Per esempio:
java -Dlog4j.configuration=customName ....
Farà sì che log4j cerchi un file chiamato customName nel classpath.
Se hai problemi, trovo utile attivare il log4j.debug:
-Dlog4j.debug
Stamperà su System.out un sacco di informazioni utili su quale file ha usato per inizializzarsi, quali logger / appender sono stati configurati e come ecc.
Il file di configurazione può essere un file di proprietà java o un file xml. Ecco un esempio del formato del file delle proprietà preso da la pagina di documentazione introduttiva di log4j:
log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
Trova online un log4j.properties o un log4j.xml che abbia un appender root, e mettilo nel tuo classpath.
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.rootLogger=debug, stdout
registrerà nella console. Preferisco il logging su un file in modo da poter indagare in seguito.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.maxFileSize=100KB
log4j.appender.file.maxBackupIndex=5
log4j.appender.file.File=test.log
log4j.appender.file.threshold=debug
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug,file
anche se per le applicazioni di log verboso 100KB di solito devono essere aumentati a 1MB o 10MB, specialmente per il debug.
Personalmente ho impostato più logger, e ho impostato il logger principale su warn o error level invece che su debug.
In cosa stai sviluppando? Stai usando Apache Tomcat?
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyyMMdd HH:mm:ss.SSS} [[%5p] %c{1} [%t]] %m%n
Ho una proprietà come questa in una mia app Java.