Utilizzare Log4j per controllare le nostre applicazioni Java
Vediamo come iniziare ad utilizzare molto velocemente Log4J, potente tool della Apache Foundation che ci permette di tenere sotto controllo errori, warning e quant’altro ci possa interessare, della nostra applicazione.
Log4J è senza dubbio uno strumento fondamentale per una applicazione che necessiti di un controllo approfondito del suo stato di vita. Probabilmente una volta iniziato ad utilizzarlo non smetteremo più, sostituendolo addirittura al classico “System.out.println(“”)” tanto usato in fase di test e debugging.
Come tutti i prodotti della Apache Foundation anche questo è opensource. Cominciamo scaricando il pacchetto. L’installazione è abbastanza semplice, si tratta solo di estrarre dallo zip scaricato il file jar che contiene le classi e includerlo nel nostro progetto. Probabilmente vorrete includerlo nelle librerie sempre disponibili per le vostre applicazioni server, in questo caso, se usate tomcat, copiatelo in: common/lib
Fatto questo, dobbiamo configurare il logger per l’uso che dobbiamo farne nella nostra applicazione. Esistono infinite opzioni e svariati ambiti di utilizzo, ma per le prime volte credo basterà utilizzare un file di configurazione standard, salvandolo come log4j.properties
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#### Use two appenders, one to log to console #### another to log to a file log4j.rootCategory=debug, stdout, R # Print only messages of priority WARN or higher for your category log4j.category.your.category.name=WARN # Specifically inherit the priority level #log4j.category.your.category.name=INHERITED #### First appender writes to console 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 #### Second appender writes to a file log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=NomeProgramma.log # Control the maximum log file size log4j.appender.R.MaxFileSize=100KB # Archive log files (one backup file here) log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n |
Con questa configurazione, il log verrà visualizzato sulla console e contemporaneamente salvato su file, a blocchi di 100kb. L’ultimo log lo troveremo salvato in NomeProgramma.log, gli altri in file dal nome consecutivo : NomeProgramma.log.1, NomeProgramma.log.2. In pratica andiamo a settare il livello di errore che vogliamo visualizzare e salvare.
Poi nell’applicazione possiamo sbizzarrirci nell’inserire tutti i messaggi che vogliamo, facendo attenzione a diversificare i livelli di “pericolosità”. In questo modo, per visualizzare solo una parte dei commenti e non doversi districare in una giungla di errori, basterà modificare il file di proprietà, senza cambiare nulla nel codice.
I livelli sono:
- Debug per i messaggi di “debugging”.
- Info per i messaggi di tipo “verbose”.
- Warn per i messaggi di “warning”.
- Error per i messaggi di errore.
- Fatal per i messaggi di errore grave (con crash dell’applicazione).
- Log per i messaggi di log.
- All per tutti i messaggi.
Possiamo scegliere diversi tipi di output dei log:
- ConsoleAppender per visualizzarli nella console
- FileAppender per salvarli in un unico file
- RollingFileAppender per salvarli in più file di grandezza definita
- DailyRollingFileAppender per salvarli in file diversi a seconda della data
Esistono anche diversi tipi di Layout:
- PatternLayout : Layout testuale
- HTMLLayout : Layout Html
- XMLLayout : Layout Xml
- TTCCLayout : Altro tipo di Layout sconosciuto ai più 😉
Utilizzare Log4J nell’applicazione è semplicissimo, basta istanziare una Category:
1 |
Category cat = Category.getRoot(); |
oppure
1 |
Category cat = Category.getInstance(TestLogging.class.getName()); |
Scrivere un messaggio è immediato:
1 |
cat.warn("messaggio"); |
oppure
1 |
cat.error("messaggio"); |
e via dicendo, con metodi che hanno lo stesso nome del livello di errore.