Wenn man eine Entwicklungsumgebung für ein neues Projekt aufsetzt, ist die Frage des Loggingmanagements eine wichtige und grundlegende, für die es lohnt zu Beginn eines größeren Projekts Zeit zu investieren. Der Wunsch hierbei ist, möglichst an einer zentralen Stelle alle Konfigurationen vornehmen zu können, um mit diesen Einstellungen alle Loggingvorgänge zu steuern, sowohl für den Entwicklungsprozess als auch später in der Produktion. Allerdings benötigt man oft verschiedenste Bibliotheken für das eigene Projekt in denen die verwendeten Logging-Implementierungen von einander abweichen.
Die (/Eine) Lösung hierfür: slf4j. slf4j ist zurzeit eines der verbreitesten und anpassungfähigsten Loggingframeworks. Es ist de facto keine tatsächliche Bibliothek eines Loggers sondern eine Art Interface für verschiedenste Logger-Implementierungen wie etwa log4j, java.util.logging oder logback. Die Idee dahinter ist, sich für eine Implementierung zu entscheiden, bspw. log4j, diese Entscheidung slf4j mitzuteilen und alles, was nicht sowieso schon mit slf4j oder log4j geloggt wird, auf das “slf4j-Interface” zu mappen.
Eine konkrete Umsetzungen dessen werde ich im Folgenden kurz beschreiben. Anfangsszenario: Für unser Projekt brauchen wir Bibliotheken, die sowohl mit log4j, java.util.logging und slf4j (sofern existent) loggen. Wir entscheiden uns für die Verwendung der log4j-Implementierung für slf4j. Die Konfigurationen für log4j können wir in der log4j.xml formulieren, die wir im src/main/resources-Ordner unseres Projekts ablegen. Was brauchen wir jetzt? Wir brauchen folgende Pakete: slf4j-api, slf4j-log4j12, log4j und jul-to-slf4j. slf4j-api ist die API für slf4j, slf4j-log4j12 delegiert sämtliches Logging von slf4j auf unsere Implementierung log4j. log4j beinhaltet die entsprechende Implementierung. jul-to-slf4j leitet das Logging des java.util.logging-Loggers auf slf4j um. Damit dies aber auch wirklich funktioniert müssen wir beim Ausführen unserer Anwendung noch einen VM-Parameter mitgeben, und zwar
-Djava.util.logging.config.file=[path to logging.properties]
wobei [path to logging.properties] der Pfad ist zu einer logging.properties Datei, die wir kurzerhand aus dem lib Ordner unsereres Java-Runtime-Ordners kopieren und als einzigen Handler die entsprechenden slf4j-Bridge-Handler hinzufügen. Konkret heißt das, die Zeile
handlers=org.slf4j.bridge.SLF4JBridgeHandler
zu ergänzen und alle anderen Zeilen beginnend mit handlers auszukommentieren. Nun sind alle Konfigurationen zentral über die log4j.xml Datei zu handhaben.
Man ist jedoch nicht an log4j gebunden und hat mit slf4j viele Möglichkeiten. Für weitere Informationen sei auf die slf4j-Homepage verwiesen.