Java 1.4 racchiude in se una potente API destinata al logging, anche se poco conosciuta, questa interfaccia racchiude molte potenzialità.
Il package destinato al logging è java.ulil.logging, la cui classe principale e Logger.
Per prima cosa bisogna importare il package, dopo bisognerà creare un riferimento in memoria al logger, perciò il mio consiglio è di renderlo statico per poterlo condividere meglio:
static Logger log;
In seguito bisognerà ottenere il logger per il proprio package (che equivale a creare un Logger): perciò nel metodo di inizializzazione del proprio programma bisognerà aggiungere questa riga:
log=Logger.getLogger("com.nomeProgetto");
Adesso il logger è creato ma scrive in memoria. Per farlo scrivere su un file bisogna appoggiarsi ad un'altro tipo di classe, detta Handler. Ci sono vari tipi di Handler standard:
-StreamHandler: Scrive su un OutputStream.
-ConsoleHandler: Scrive su System.err
-FileHandler: Scrive su un file o vari file a rotazione.
-SocketHandler: Scrive su una porta TCP remota.
-MemoryHandler: Scrive semplicemente in memoria.
Ma naturalmente se ne possono creare di personalizzati.
Per scrivere su un file utilizzeremo la classe FileHandler che si crea così
static FileHandler fh=new FileHandler("nomefile");
ATTENZIONE: questa chiamata richiede il blocco try/catch perciò è bene fare atenzione a dove la si posiziona.
Poi aggiungeremo il FileHandler al Logger ottenuto il precedenza così (uno stesso Logger può avere diversi Handler):
log.addHandler(fh);
L'output di un Handler, che sia diretto in un file o in console poù essere formattato tramite una classe, Formatter, che si occupa di come verranno presentati i dati. I Formatter standard sono 2:
SimpleFormatter: Scrive un classico log solo testo formattato con tabulazioni.
XMLFormatter: Scrive una riassunto strutturato con XML.
Ma come al solito si può creare il proprio Formatter personalizzato. Questa classe deve impostata in un Handler con il metodo:
fh.setFormatter(Formatter newFormatter);
La formattazione predefinita per il FileHandler è quella XML.
Ma come si fa a mandare messaggi al Logger?
Innanzi tutto i messaggi (classe logRecord) hanno una priorità (gestita dalla classe level), che può essere:
-SEVERE (Molto grave)
-WARNING
-INFO
-CONFIG
-FINE
-FINER
-FINEST (importanza più bassa)
Ciascuna di queste corrisponde ad una variabile statica di Level, (es: Level.INFO) e l'uso di questa scala è a totale discrezione del programmatore che, naturalmente, ne può creare anche di personazizzati.
Per mandare dei messaggi esiste un metodo generico di logger: log() che ha 5 signatures
-void log(Level level, String msg)
-void log(Level level, String msg, Object param1)
-void log(Level level, String msg, Object[] params)
-void log(Level level, String msg, Throwable thrown)
-void log(LogRecord record)
Inoltre esistono alcuni metodi che loggano direttamente dei messaggi con determinati livelli:
-severe(String msg)
-warning(String msg)
-info(String msg)
-config(String msg)
-fine(String msg)
-void finer(String msg)
-void finest(String msg)
Es: severe("ciao") corrisponde a log(Level.SEVERE,"Ciao")
l'oggetto logger ha un metodo setLevel() che specifica il livello dei Record gestiti, questo va impostato all'inizio, altrimenti si rischia che il Logger non funzioni perchè eredita il filtro dal suo genitore. Va impostato con:
log.setLevel(Level newLevel)
Impostandolo con Level.ALL il Logger fa passare tutti i messaggi.
Il flusso dei dati può essere filtrato anche con degli oggetti che implementano l'interfaccia Filter (non esistono classi predefinite che la estendono). Il filtro può essere impostato col metodo
setFilter(Filter newFilter);
sia su un Logger che su un Handler, e la classe deve implementare il metodo
boolean isLoggable(LogRecord record);
Questa API consente anche di creare un file .properties che autoconfiguri il logger attraverso la classe LogManager e di utilizzare le permissioni di accesso, ma argomenti così avanzati esulano dallo scopo di questa pillola. Quì di seguito riporto il codice completo di una semplicissima classe di esempio. Se volete saperne di più consultate la documentazione di Java, fonte per questa mia guida.
PS: se doveste trovare errori o imprecisioni, vi prego di segnalarmeli!codice:public class ProvaLoggging{ private static Logger logg = Logger.getLogger("it.html.forum"); private static FileHandler fh; public static void main(String argv[]) {. fh = new FileHandler("mylog.txt"); log.addHandler(fh); logger.setLevel(Level.ALL); logger.info("Ciao"); } }