Außerdem: Über 80 Bugfixes und Verbesserungen

Apache Log4j 2.7 bringt verbesserten Scala-Support und müllfreie ThreadContext-Maps

Dominik Mohilo

© Apache Software Foundation

Das beliebte Logging-Framework Apache Log4j wurde speziell für das Aufzeichnen der Verhaltensweisen von Applikationen entwickelt. Mit Log4j 2 wurde das mittlerweile veraltete Log4j 1.x abgelöst, durch neue Funktionen erweitert und grundsätzlich überarbeitet. In der neuesten Version Log4j 2.7 wurden neue APIs für Scala 2.10 und 2.11 implementiert und zahlreiche Bugs gefixt.

Features

Das elfte große Release von Log4j ist nicht ganz so umfangreich wie der Vorgänger, bringt aber dennoch einige nützliche Features. Gerade über die neuen Logging-Module für Scala 2.10 und Scala 2.11 werden sich viele Nutzer freuen. Die neuen APIs sollen auch die Nutzung von Scala-Features wie Makros und String-Interpolation möglich machen.

Die ThreadContext-Map kann nun so konfiguriert werden, dass sie „Garbage-Free“ ist. Nutzer des Logging-Frameworks können hierfür mit der aktuellen Version auch Kontextdaten von anderen Quellen als dem ThreadContext einfügen. Zu den verwendbaren Kontextdatenwerten gehören sämtliche Objekte, nicht nur Strings.

Mit Log4j 2.7 wurde auch der Support neuer Warteschlangen-Implementierungen in den AsyncAppender eingebaut. Fest ist dabei die Unterstützung für die java.util.concurrent.LinkedTransferQueue, optional die für Conversants DisruptorBlockingQueue und die MPSC Bounded lock free queue der JCTools.

Der RoutingAppender kann nun auch via Script konfiguriert werden, dies war in vorherigen Versionen nicht möglich. Hinzu kommt mit der Aktualisierung des Frameworks ein neuer Appender, nämlich der ScriptAppenderSelector. Diesem ist es möglich, einen weiteren Appender, der via Script spezifiziert wurde, zu erstellen.

Wichtig zu erwähnen ist auch, dass das API von Log4j 2.7 sowie viele Kernkomponenten Binärkompatibilität für frühere Versionen beinhalten. Die grundlegende Kompatibilität zu Log4j 1.x wird durch die Komponente log4j-1.2-api gewährleistet. Um ausgeführt zu werden und zu builden, benötigt Log4j 2.7 mindestens Java 7. Die letzte Version die Java 6 unterstützte war Log4j 2.3.

Bugfixes

Neben den insgesamt 30 Verbesserungen, die durchgeführt wurden, bringt Log4j 2.7 auch 55 gefixte Bugs. Dazu zählt unter anderem das Verhindern einer NullPointerException (NPE) in FastDateParser$TimeZoneStrategy und Level.isInRange sowie das Verhindern von NPEs, wenn Filter dynamisch entfernt werden und wenn RingBufferLogEvent.getFormattedMessage() in Web-Anwendungen verwendet wird.

Um die Kompatibilität mit anderen Bibliotheken (wie etwa Camel) zu gewährleisten, wurde die Möglichkeit in Log4j 2.7 eingebaut, Lookups zu komplett zu deaktivieren. Auch das Problem des Verlustes von Exceptions, wenn ein Security Manager verwendet wird, wurde behoben. Dieses Problem trat seit Log4j 2.6.2 auf.

Eine kleine Quelleninkompatibilität hat sich beim Hinzufügen neuer Methoden zum Logger-Interface eingeschlichen. Hat man Code, der logger.error(null, "This is the log message", throwable); ausführt, bekommt man einen Compiler-Fehler, der die Referenz als mehrdeutig bezeichnet. Dieses Problem tritt auf jeder Log-Ebene auf. Um dies zu umgehen empfehlen die Macher die Verwendung von logger.error("This is the log message", throwable); oder logger.error((Marker) null, "This is the log message", throwable);.

Eine vollständige Übersicht der für Log4j 2.7 durchgeführten Änderungen und gefixten Bugs sowie der neuen Features gibt es auf dem Blog von Log4j und auf der Homepage des Logging-Tools.

Apache Log4j

Bereits 20 Jahre hat Log4j auf dem Buckel. Ceki Gülcü entwickelte das Logging-Framework 1996, das heute in vielen Projekten kommerzieller oder Open-Source-Software als Standard gilt. Mittlerweile ist das Logging-Framework fester Bestandteil des Apache Logging-Projektes, ist nach wie vor quelloffen (Apache-Lizenz 2.0) und Vorbild für zahlreiche Logging-Tools, die sich nicht nur namentlich, sondern auch funktionell nah am Vorbild orientieren. Diese sind allerdings nur zum Teil ebenfalls im Logging-Projekt der Apache Foundation beheimated (etwa Log4php oder Log4cxx).

Log4j dient in erster Linie dazu, auftretende Fehler auf der Standardausgabe auszugeben, sondern Meldungen über Logger an den Appender (das entsprechende Loggingsystem) weiterzuleiten. Log4j ermittelt, wohin die Weiterleitung stattfinden muss, gleichzeitig aber auch, ob die Weiterleitung überhaupt stattfindet. Diese Entscheidung basiert auf dem sogenannten Log-Level, also auf der jeweiligen Wichtigkeit des Fehlers oder der Meldung.

Mit Apacha Log4j 2 veröffentlichten die Entwickler des Projektes eine von Grund auf überarbeitete Fassung, die viele Fehler der vorherigen Version 1.x ausbesserte, aber essentielle und wichtige Teile der Vorversion übernahmen. Revolutionär war insbesondere die Einführung asynchroner Logger, bei denen I/O-Operationen in einem separaten Thread ausgeführt wurden. Ein bis zu 68-fach höherer Datenfluss konnte im Vergleich zum synchronen Modell festgestellt werden. Zudem gab es seit der Einführung 2014 endlich die Möglichkeit Log4j mit JSON zu konfigurieren und eine Plug-in-Architektur wurde implementiert.

Geschrieben von
Dominik Mohilo
Dominik Mohilo
Dominik Mohilo studierte Germanistik und Soziologie an der Goethe-Universität in Frankfurt. Seit 2015 ist er Redakteur bei S&S-Media.
Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu: