Logging
El registre en logs (logging) permet organitzar d'una forma més óptima els missatges generats en temps d'execució per un programari, i és una alternativa millor que els System.out.println
. Té els següents avantatges:
- Permet assignar una prioritat als missatges, i posteriorment filtrar-los. Tant de forma global com per paquets (packages) i classes.
- Permet reencaminar els missatges a diferents destins, com consola, fitxer, etc.
- Permet adaptar el format dels missatges, com per exemple en text, en XML o a base de dades.
Java conté a la seva llibreria base el paquet java.util.logging
. Aquest paquet pot ser utilitzat de forma bàsica de la següent forma:
private static final Logger LOGGER = Logger.getLogger(LaMevaClasse.class.getName());
Aquesta sentència es pot afegir al començament d'una classe, per tal de fer-hi referència posteriorment. Per exemple:
LOGGER.log(Level.INFO, "un missatge");
El primer paràmetre és el nivell de la notificació, i el segon el missatge. El nivell pot variar entre SEVERE (valor més alt), WARNING, INFO, CONFIG, FINE, FINER i FINEST (valor més baix).
A més, aquest mètode permet utilitzar paràmetres per posició amb el codi {0}, {1}... o passant una excepció.
LOGGER.log(Level.FINE, "un missatge amb paràmetre {0}", "1");
LOGGER.log(Level.WARNING, "un missatge amb paràmetres {0} i {1}", new Object[]{"1", 2});
LOGGER.log(Level.SEVERE, "un missatge sense paràmetre i amb excepció", new RuntimeException("una excepció"));
Tot i que el mètode log(String)
és el més estàndard i convenient, també hi ha mètodes de Logger
per a cada nivell que faciliten l'escriptura:
severe(String), warning(String), info(String), config(String), fine(String), finer(String), finest(String)
Configuració
Si tenim un arxiu loggingConfigFile
(tipus File
) amb l'arxiu de configuració, hem de configurar el registre al començament de l'execució del programari mitjançant la classe LogManager:
LogManager.getLogManager().readConfiguration(new FileInputStream(loggingConfigFile));
Aquesta podria ser una configuració mínima amb nivell màxim de FINE que utilitza un formatador, SimpleFormatter per a la consola i un arxiu:
# two handlers defined:
handlers= java.util.logging.ConsoleHandler, java.util.logging.FileHandler
# default root level, overrided for package and for the LoggingTest class:
level = FINE
test.excepcions.level = INFO
test.excepcions.LoggingTest.level = FINEST
# console handler configuration (https://docs.oracle.com/en/java/javase/11/docs/api/java.logging/java/util/logging/ConsoleHandler.html)
java.util.logging.ConsoleHandler.level = FINEST
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
# default SimpleFormatter format
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL %4$-7s [%3$s] %5$s %6$s%n
# file handler configuration (https://docs.oracle.com/en/java/javase/11/docs/api/java.logging/java/util/logging/FileHandler.html)
java.util.logging.FileHandler.level = ALL
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.FileHandler.pattern = %h/logging_test_%g.log
java.util.logging.FileHandler.limit = 1000000
java.util.logging.FileHandler.count = 10
El nivell FINE s'utilitza per defecte per tots els missatges. Es podria configurar per classe:
test.LoggingTest.level = FINEST