Log4j 2 und Lambda-Ausdrücke

Log4j 2 und Lambda-Ausdrücke

1. Überblick

Die BibliothekLog4j 2unterstützt seit Version 2.4 Java 8-Lambda-Ausdrücke. These expressions can be used by the Logger interface to enable lazy logging.

Sehen wir uns ein kurzes Beispiel an, wie wir diese Funktion nutzen können.

Weitere Informationen zuLog4j 2 finden Sie auch in unserenintroductory article.

2. Lazy Logging mit Lambda-Ausdrücken

Eine potenzielle Leistungsverbesserung für Anwendungen, die die Protokollierung verwenden, kann sich aus der Vermeidung der Berechnung von Protokollnachrichten ergeben, wenn die entsprechende Protokollstufe nicht aktiviert ist.

Sehen wir uns zunächst eine einfache Protokollanweisung auf TRACE-Ebene an:

logger.trace("Number is {}", getRandomNumber());

In diesem Beispiel wird die MethodegetRandomNumber()aufgerufen, um den Protokollnachrichtenparameter zu ersetzen, unabhängig davon, ob TRACE-Anweisungen angezeigt werden oder nicht. Wenn beispielsweise die Protokollstufe auf DEBUG eingestellt ist, protokolliertlog4j 2 die Nachricht nicht, aber die MethodegetRandomNumber() wird weiterhin ausgeführt.

Mit anderen Worten kann die Ausführung dieses Verfahrens unnötig sein.

Vor dem Hinzufügen der Unterstützung für Lambda-Ausdrücke konnten wir das Erstellen von Nachrichten vermeiden, die nicht protokolliert wurden, indem wir vor dem Ausführen der Protokollanweisung die Protokollebene explizit überprüften:

if (logger.isTraceEnabled()) {
    logger.trace("Number is {}", getRandomNumer());
}

In diesem Fall wird die MethodegetRandomNumber() nur aufgerufen, wenn die TRACE-Protokollebene aktiviert ist. This can improve performance depending on how expensive the execution of methods used to substitute parameters is.

Durch die Verwendung von Lambda-Ausdrücken können wir den obigen Code weiter vereinfachen:

logger.trace("Number is {}", () -> getRandomNumber());

The lambda expression is only evaluated if the corresponding log level is enabled. Dies wird als verzögerte Protokollierung bezeichnet.

Wir können auch mehrere Lambda-Ausdrücke für eine Protokollnachricht verwenden:

logger.trace("Name is {} and age is {}", () -> getName(), () -> getRandomNumber());

3. Fazit

In diesem kurzen Tutorial haben wir gesehen, wie wir Lambda-Ausdrücke mitLog4j 2-Loggern verwenden können.

Wie immer kann der vollständige Quellcode des Beispielsover on GitHub gefunden werden.