Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [Pillola] java.util.logging

    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.
    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");
    
        }
    }
    PS: se doveste trovare errori o imprecisioni, vi prego di segnalarmeli!
    Blink@go

    "Non tutto quel che è oro brilla, Ne gli erranti sono perduti; Il vecchio ch'è forte non s'aggrinza, Le radici profonde non gelano.Dalle ceneri rinascerà un fuoco, L'ombra sprigionerà una scintilla, Nuova sarà la lama ormai rotta, E re quei ch'è senza corona."

    ------------
    Lang: java 1.4.1 Eclipse

  2. #2
    Ottimo, grazie per la pillola. Al primo utilizzo ti dico come mi sono trovato.

  3. #3
    Ti troverai bene!
    Non credo che molti altri linguaggi abbiano un'API così potente per il logging!
    Blink@go

    "Non tutto quel che è oro brilla, Ne gli erranti sono perduti; Il vecchio ch'è forte non s'aggrinza, Le radici profonde non gelano.Dalle ceneri rinascerà un fuoco, L'ombra sprigionerà una scintilla, Nuova sarà la lama ormai rotta, E re quei ch'è senza corona."

    ------------
    Lang: java 1.4.1 Eclipse

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    118
    Scusate, leggendo le pillole sono capitato qui. Ma cos'è il logging?

  5. #5
    Utente di HTML.it L'avatar di Angelo1974
    Registrato dal
    Feb 2003
    Messaggi
    1,107
    Grazie; avevo letyto qualcosina di sfuggita ma non mi era mai capoitato un esempio chiaro davanti; non appena lo uso ( ed a questo punto penso presto ) ti farò sapere.

    P.S: per logging, in soldoni, si intende un tracciamento di tutto quello che avviene all'interno di una applicazione; in pratica tutte le eccezioni che si possono generare, tutte le informazioni utili sono, di solito, salvate in file detti di "log" e che hanno, ovviamente, estensione .log
    Se vuoi trovare l'arcobaleno, devi sopportare la pioggia

  6. #6
    Utente di HTML.it L'avatar di Angelo1974
    Registrato dal
    Feb 2003
    Messaggi
    1,107
    Per blinkago
    Sto provando le api logging; l'unica cosa che non ho notato a differenza di quanto avviene col log4j è che non si può settare una dimensione massima del file di log che si crea o sbaglio? Quanto meno mi sembra di non aver trovato nulla di simile. Tu? Hai trovato qualcosa che renda possibile quanto avviene in log4j e cioè setti una dimensione max al file in maniera tale che, quando il file raggiunge quella dimensione, se ne crea uno nuovo e il vecchio viene rinominato e conservato.
    Se vuoi trovare l'arcobaleno, devi sopportare la pioggia

  7. #7
    Originariamente inviato da Angelo1974
    Per blinkago
    Sto provando le api logging; l'unica cosa che non ho notato a differenza di quanto avviene col log4j è che non si può settare una dimensione massima del file di log che si crea o sbaglio? Quanto meno mi sembra di non aver trovato nulla di simile. Tu? Hai trovato qualcosa che renda possibile quanto avviene in log4j e cioè setti una dimensione max al file in maniera tale che, quando il file raggiunge quella dimensione, se ne crea uno nuovo e il vecchio viene rinominato e conservato.
    public FileHandler(String pattern, int limit, int count)

    questo è un costruttore della classe FileHandler dove, oltre al nome si specifica il limite in byte del log e il numero(count di files da usare..)
    Blink@go

    "Non tutto quel che è oro brilla, Ne gli erranti sono perduti; Il vecchio ch'è forte non s'aggrinza, Le radici profonde non gelano.Dalle ceneri rinascerà un fuoco, L'ombra sprigionerà una scintilla, Nuova sarà la lama ormai rotta, E re quei ch'è senza corona."

    ------------
    Lang: java 1.4.1 Eclipse

  8. #8
    Utente di HTML.it L'avatar di Angelo1974
    Registrato dal
    Feb 2003
    Messaggi
    1,107
    Grazie; ho visto solo ieri questa classe.
    Ciao
    Se vuoi trovare l'arcobaleno, devi sopportare la pioggia

  9. #9
    Utente di HTML.it L'avatar di faneco
    Registrato dal
    Sep 2004
    Messaggi
    18
    io uso log4j.

    log4j e' un pacchetto dell' apache che permette permette di effettuare dei log di un applicazione.sostanzialmente,per molti versi e' equivalente all' API standard.

    ho trovato questo articolo che tratta,nell' ultima parte,le differenze tra log4j e l'API standard java.

    a chi interessasse

    http://builder.com.com/5100-22_14-1046694-2.html



    "Se tutto fosse illusione e nulla esistesse? In questo caso avrei pagato
    decisamente troppo per il mio tappeto".
    Woody Allen

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,890
    "BUMP!"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.