martedì 25 ottobre 2011

Esempio utilizzo java.util.Logging

La libreria java.util.Logging è molto utilizzata per il log delle applicazioni Java.
Il suo più grande vantaggio è che è uno standard incluso nella jdk.
E' possibile inoltre personalizzare i formati di output in modo da costruirsi a proprio piacimento il file di log.
Le categorie di log utilizzate, dalla più severa alla più lieve, sono:

  1. SEVERE
  2. WARNING
  3. INFO
  4. CONFIG
  5. FINE
  6. FINER
  7. FINEST
Di default il file di configurazione della classe di Logging si trova in [JAVA_HOME]/jre/lib e si chiama logging.properties.
Le proprietà di default sono di avere un solo handler java.util.logging.ConsoleHandler, quindi scrive soltanto su console, e come soglia INFO.

Per customizzare il comportamento bisogna fare in modo che la jvm prenda in considerazione all'avvio del nostro programma il nostro file di properties. Per fare questo all'avvio del pgm Java settiamo la proprietà di sistema -Djava.util.logging.config.file=log.properties.

Di seguito la console di lancio di Eclipse con questa opzione.


Il file di properties è così configurato:

############################################################
# Esempio 2 Logging Configuration File
############################################################
#due handler
handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
#livello globale
.level= FINEST
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
# specifico varie proprietà per il logging su File
java.util.logging.FileHandler.level= INFO
java.util.logging.FileHandler.pattern = log/java_%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
# specifico varie proprietà per il logging su Console
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter


Abbiamo due handlers uno su file uno su console.

Nell'esempio (un semplice main), vediamo anche come sia possibile inserire un nuovo Handler che gestisca il logging su Excel.

public class LogInfo {
   
    static Logger log=Logger.getLogger(LogInfo.class.getName());

    /**
     * @param args
     * @throws IOException
     * @throws SecurityException
     */
    public static void main(String[] args) throws SecurityException, IOException {
       
        FileHandler f=new FileHandler("log/log.csv");
        Formatter formatterCSV = new MyCsvFormatter();
        f.setFormatter(formatterCSV);
        log.addHandler(f);

        log.warning("Test Valori Sistema");
        log.info( "----------------------------------------------------------------------------");
        log.info( "JRE: " + System.getProperty("java.runtime.name"));
        log.info("JRE Version: " + System.getProperty("java.vm.version"));
        log.info("JRE Vendor: " + System.getProperty("java.vm.vendor"));
        log.info("JRE Boot Path: " + System.getProperty("sun.boot.library.path"));
        log.info("User Country: " + System.getProperty("user.country"));
        log.info("User Language: " + System.getProperty("user.language"));
        log.info("Character Encoding: " + System.getProperty("file.encoding"));
        log.info("Massima memoria allocabile:" + (Runtime.getRuntime().maxMemory()/1024) + "Kb");
        log.info("Dimensione attuale Heap:" + (Runtime.getRuntime().totalMemory()/1024) + "Kb");
        log.info("----------------------------------------------------------------------------");

    }

}

Questa è la classe che si occupa di generare il csv:

import java.text.SimpleDateFormat;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
public class MyCsvFormatter extends Formatter {

    private static final String FORMAT_DATE="yyyy-MM-dd HH:mm:ss:SSS";
    @Override
    public String format(LogRecord record) {
        StringBuffer buf = new StringBuffer();
        if(record.getLevel().intValue()>=Level.WARNING.intValue()){
       
        buf.append(record.getLevel());
        buf.append(";");
        buf.append(formatDate(record.getMillis()));
        buf.append(";");
        buf.append(record.getMessage());
        buf.append("\n");
        }
        return buf.toString();
    }
    private String formatDate(long millis){
        SimpleDateFormat sdf=new SimpleDateFormat(FORMAT_DATE);
        return sdf.format(new java.util.Date(millis));
    }
  
}


Poichè il livello di logging scritto su csv è warning troveremo soltanto

WARNING;2011-10-25 17:07:34:093;Test Valori Sistema

Mentre sul txt e sulla console (poichè i livelli di soglia sono gli stessi):


25-ott-2011 17.07.34 it.test.LogInfo main
AVVERTENZA: Test Valori Sistema
25-ott-2011 17.07.34 it.test.LogInfo main
INFO: ----------------------------------------------------------------------------
25-ott-2011 17.07.34 it.test.LogInfo main
INFO: JRE: Java(TM) SE Runtime Environment
25-ott-2011 17.07.34 it.test.LogInfo main
INFO: JRE Version: 20.0-b11
25-ott-2011 17.07.34 it.test.LogInfo main
INFO: JRE Vendor: Sun Microsystems Inc.
25-ott-2011 17.07.34 it.test.LogInfo main
INFO: JRE Boot Path: C:\Programmi\Java\jre6\bin
25-ott-2011 17.07.34 it.test.LogInfo main
INFO: User Country: IT
25-ott-2011 17.07.34 it.test.LogInfo main
INFO: User Language: it
25-ott-2011 17.07.34 it.test.LogInfo main
INFO: Character Encoding: Cp1252
25-ott-2011 17.07.34 it.test.LogInfo main
INFO: Massima memoria allocabile:253440Kb
25-ott-2011 17.07.34 it.test.LogInfo main






Nessun commento:

Posta un commento