Java Standard: Logging API von Java


Mit Logging wird das Protokollieren eines Programmablaufes beschrieben.

Grundsätzlich reicht dazu schon ein System.out.println("Nachricht"); aus. Allerdings bringt es die weitere Entwicklung recht schnell mit sich, dass das Interesse an "alten" Debug-Nachrichten schwindet oder diese das Protokoll unleserlich oder überfrachtet erscheinen lassen. So ist der Entwickler gezwungen, diese nun überflüssigen Nachrichten entweder auszukommentieren oder zu löschen. Beides erfordert einigen Aufwand: In welcher Klasse wird die Nachricht erzeugt? Wird die Nachricht eventuell noch einmal benötigt? Usw.

Seit Java 1.4 wird die "Java Logging API" ausgeliefert. Damit ist es möglich, im Programmcode den einzelnen Nachrichten verschiedene Dringlichkeiten, so genannte Loglevels, zuzuordnen. Über diese Loglevels ist es möglich, zentral zu steuern, welche Nachrichten von welcher Klasse mit welcher Dringlichkeit mitzuprotokollieren sind. Für die "Java Logging API" werden diese Einstellungen in der logging.properties eingetragen. Die Original-Datei liegt im Java Installationsverzeichnis unterhalb des lib Verzeichnis.

# Der ConsoleHandler gibt die Nachrichten auf std.err aus
handlers= java.util.logging.ConsoleHandler

# Alternativ können weitere Handler hinzugenommen werden. Hier z.B. der Filehandler
#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler

# Festlegen des Standard Loglevels
.level= INFO
 
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

# Die Nachrichten in eine Datei im Benutzerverzeichnis schreiben
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

# Zusätzlich zu den normalen Logleveln kann für jeden Handler noch ein eigener Filter 
# vergeben werden. Das ist nützlich wenn beispielsweise alle Nachrichten auf der Konsole ausgeben werden sollen
# aber nur ab INFO in das Logfile geschrieben werden soll.
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
 
############################################################
# Extraeinstellungen für einzelne Logger
############################################################

# Für einzelne Logger kann ein eigenes Loglevel festgelegt werden.
de.wikibooks.loggingapi.level = FINEST
de.wikibooks.assertions.level = SEVERE

Die Properties sind in einer Baumstruktur organisiert. Der erste Knoten also die Wurzel des Baumes ist ".level"; hier wird der Default-Loglevel festgelegt. Alle Kinder erben den Loglevel des Eltern-Knotens. Also in obigem Beispiel sind "de" und "de.wikibooks" auf dem Log-Level der Wurzel, erst "de.wikibooks.loggingapi" und dessen Kinder haben den Log-Level FINEST.

Falls nicht die Original-logging.properties-Datei benutzt werden soll, kann über die System-Property java.util.logging.config.file die stattdessen zu verwendende Datei angegeben werden (der Beispielpfad D:\pfad\zur\datei\logging.properties ist in Windows-Notation angegeben. Andere Betriebssystem verwenden ggf. eine andere Notation) :

-Djava.util.logging.config.file=D:\pfad\zur\datei\logging.properties

In die Java-Klassen müssen einige Imports eingefügt werden

import java.util.logging.Level;
import java.util.logging.Logger;

Dann muss der Logger erstellt werden

private static Logger jlog =  Logger.getLogger("de.wikibooks");
static {
	jlog.log(Level.SEVERE, "Nachricht");
}

Das Protokoll dieser Anweisungen sieht dann in etwa so aus.

11.01.2007 14:41:48 de.wikibooks <clinit>
SCHWERWIEGEND: Nachricht
Bearbeiten

Ein Werkzeug, um Java-Code automatisch mit Logging-Ausgaben zu versehen: Loggifier