logback – der Nachfolger von log4j

veröffentlicht am 07. April 2012

Noch immer gilt log4j als das Standard Logging Framework unter Java. Dabei wird log4j schon seit einiger Zeit nicht mehr weiterentwickelt und selbst von Ceki Gülcü, dem Gründer von log4j, als obsolete bezeichnet. Stattdessen sollte man lieber auf logback setzen, dem inoffiziellen Nachfolger von log4j, der ebenfalls von Ceki Gülcü ins Leben gerufen wurde.

Es sprechen viele triftige Gründe für den Umstieg von log4j auf logback. Ich gebe hier eine kompakte, von der Projektseite übersetzte Zusammenfassung:

  • Höhere Performance (teilweise bis zu 10x schneller) und weniger RAM Verbrauch
  • Wesentlich höhere Testabdeckung im Vergleich zu log4j
  • Native Implementierung der SLF4J API
  • Hervorragende Dokumentation
  • Konfiguration per XML oder Groovy
  • Automatisches Neuladen der Konfiguration im Betrieb
  • Lilith Unterstützung zum Analysieren sehr großer Logdateien
  • Prudent mode: mehrere Server können in eine Logdatei schreiben
  • Graceful recovery: ein Ausfall des Speichermediums erfordert keinen Neustart der Anwendung, sobald das Speichermedium wieder verfügbar ist
  • Conditionals: um das Duplizieren einer Konfiguration für verschiedene Umgebungen zu vermeiden, unterstützt logback if-then-else Konstrukte in der Konfiguration
  • Filter: logback unterstützt verschiedene Filtermöglichkeiten. So kann z.B. das Log Level für einen bestimmten Benutzer angehoben werden (sinnvol z.B. bei der Fehlersuche auf einem hochfrequentierten Produktivsystem)
  • Sifting Appender: auf Basis bestimmter Parameter kann logback verschiedene Log Dateien z.B. für verschiedene Benutzer anlegen
  • Unterstützung für die automatische Kompression archivierter Log Dateien beim RollingFileAppender
  • Mitloggen der verwendeten Bibliotheken: logback kann in Stack Traces die involvierten Bibliotheken (z.B. jetty-6.1.12.jar) ausgeben
  • Automatisches Löschen veralteter Logdateien
  • Integration in Anwendungsserver über ein Servlet: über das Paket logback-access können Serveranfragen mitgeloggt werden

Diese Liste ist natürlich nicht vollständig, logback bietet noch sehr viel mehr. Ich führe immer gerne folgendes Beispiel vor. Bei log4j stößt man häufig auf Bedingungssätze wie:

if(log.isDebugEnabled()) {
	log.debug("User " + user + " created " + file);
}

Das hat damit zu tun, dass beim Aufruf der debug-Methode zunächst der String (rechenintensiv) zusammengesetzt werden muss, um die Funktion aufzurufen. Erst dann wird innerhalb der Methode geprüft, ob der Log Level passend ist. Durch die Bedingung kann hier also unnötiges Konkatenieren entfallen, falls der Log Level niedriger ist. Liegt der Log Level jedoch höher, wird die Abfrage zweimal durchgeführt. Bei logback wird deshalb folgende Syntax verwendet:

log.debug("User {} created {}", user, file);

Hier werden einfach ein Formatierungsstring und die Referenzen an die debug-Methode übergeben. Nur wenn die dortige Log Level Überprüfung passt, wird der String zusammengesetzt.

Alles in allem kann ich auf jeden Fall empfehlen, sich einmal näher mit logback auseinanderzusetzen.

Quellen und weiterführende Links

Kommentare


Hinterlasse einen Kommentar