Configurare Java e Log4j

Programmazione - Java Visite: 20609
document_java Configurare Java e Log4j
Vediamo come aggiungere e configurare log4j ad un proprio programma Java.
Mostrerò un utile esempio di file di configurazione.

AGGIORNAMENTI
01/05/2013: aggiunte alcune info

Innanzitutto, bisogna dire cos'è Log4j!
Log4j è una libreria java di proprietà dell’Apache Sofware Foundation, che consente la gestione dei file di log della nostra applicazione Java (sia essa un'applicazione stand alone che un'applicazione web based).

Come prima cosa vi dò il link dal quale potete scaricare i file sorgenti di log4j. Il link è questo.
In realtà a noi interessa soltanto la libreria log4j seguente log4j-1.2.17.jar.
La release 1.2.17, del 13/05/2012, è di tipo Maintenance release. Conterrà soltanto una serie di fix. Qualche informazioni in più sui cambiamenti la trovate qui.
La release 1.2.16, rilasciata il 2010-04-06, è di tipo Maintenance release. Conterrà soltanto una serie di fix.
L'elenco dei fix di log4j lo potete trovare qua.

La versione 1.3 di log4j è stata abbandonata. Si sta sviluppando la versione 2.0 che ad oggi (maggio 2013) è in versione BETA.

Vediamo ora come configurare e usare log4j.
Innanzitutto bisogna importare le classi di log4j:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

 
Queste classi si trovano in commons-logging-1.1.3.jar (scaricabile qui) e rappresentano le classi di bridge per l'implementazione del logging nella vostra applicazione.
All'interno di ogni classe java che dovrà usare log4j bisogna inserire il seguente attributo:

static Logger logger = Logger.getLogger(<nome della classe>.class.getName());

Ovviamente al posto di <nome della classe> dovete mettere il nome della vostra classe java.
Oppure si può specificare il nome della category (categoria) da usare per il logging con log4j.
Se si vuole invece invocare il rootLogger di log4j si deve fare:

static Logger logger = Logger.getRootLogger();

Nel costruttore della classe dovete istanziare la configurazione di log4j così:

PropertyConfigurator.configure("log4j.properties");

Ovvero state dicendo in quale file si trovano i parametri di configurazione. Questo file va posizionato nella root della vostra applicazione.
Ad esempio se la cartella del vostro progetto è c:\mioProgetto allora il file dovrà essere in c:\mioProgetto\log4j.properties.
Un esempio abbastanza completo su come si possa configurare log4j lo trovate qui (il file si chiama log4j_example_configuration).

I passi importanti nel file di configurazione sono:

- log4j.rootLogger=TRACE, R

Così si indica da che livello si vuole partire con il log, in questo caso da TRACE che è il livello più basso, si vuole quindi loggare tutto, e si specifica il nome R (nel nostro caso, lo potete chiamare come volete ma ricordate che è case sensitive) dell'appender.
I livelli, dal meno importante al più importante, sono TRACE, DEBUG, INFO, WARN, ERROR e FATAL.

- Poi si deve stabilire l'appender, ovvero dove i vari messaggi devono andare a finire.

log4j.appender.R=org.apache.log4j.ConsoleAppender così vanno su console
log4j.appender.R=org.apache.log4j.RollingFileAppender così vanno su file

Quest'ultima opzione è molto flessibile in quanto permette di scegliere varie tipologie di rolling, come ad esempio la

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

Viene creato un file di log giornaliero.
- Poi si sceglie il tipo di layout  che si vuole dare ai messaggi come ad es.:

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

Qui le opzioni sono molte e rimando direttamente al mio file di esempio.

Finita la fase di configurazione, è sufficiente scrivere nel codice istruzioni di questo tipo:

logger.fatal("Program Aborted for...");

oppure

logger.info("User logged in");

Nel caso di log delle eccezioni del programma si può fare:
try{
...
}catch(Exception e)
{
   LOG.error(e.getMessage(), e);
}


Una configurazione da tener presente nel caso in cui ci siano più applicazioni che utilizzano log4j e che girano sullo stesso server è la seguente:

log4j.category.MyLogging=DEBUG, MYLOG
log4j.appender.
MYLOG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.
MYLOG.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.
MYLOG.File=${jboss.server.log.dir}/MyLogging.log
log4j.appender.
MYLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.
MYLOG.layout.ConversionPattern=%d %-5p [%c] %m%n
log4j.additivity.
MyLogging=false
log4j.additivity.
MYLOG=false

In questa maniera si dice che il logger (che in questo caso è una categoria ) ed il suo appender non devono ereditare da altre categorie o appender. Si evita così che il msg destinato all'appender MYLOG vada a finire in altri appender e quindi in altri file di log.

Non esitate a contattarmi se avete codice o esempi che possano chiarire meglio l'uso di log4j o estendere il mio lavoro!

Buon lavoro!