Wie man den Logging-Mechanismus mit Java8s Lambda verbessert

7

Wie ist es möglich, Ihren Logging-Mechanismus zu verbessern, indem Sie nicht den Overhead von String-Verkettungen haben?

Betrachten Sie das folgende Beispiel:

%Vor%

Die Protokollmethode log.fine(...) protokolliert nichts, da die Protokollstufe auf INFO gesetzt ist. Das Problem ist, dass die Methode getValue trotzdem ausgewertet wird.

Und das ist ein großes Leistungsproblem in großen Anwendungen mit vielen Debug-Anweisungen.

So, wie man dieses Problem löst?

    
bobbel 13.02.2014, 10:46
quelle

5 Antworten

10

Seit Java8 ist es möglich, die neuen Lambda-Ausdrücke für dieses Szenario zu verwenden .

Hier ist ein modifiziertes Beispiel der Protokollierung:

LoggerTest.class

%Vor%

LambdaLogger.class

%Vor%

Mit dieser Modifikation können Sie die Leistung Ihrer Anwendungen erheblich verbessern, wenn Sie viele Protokollanweisungen haben, die nur für Debugging-Zwecke gedacht sind.

Natürlich können Sie einen beliebigen Logger verwenden. Dies ist nur ein Beispiel für java.util.Logger .

    
bobbel 13.02.2014 10:46
quelle
8

@bobbel hat erklärt, wie es geht.

Ich möchte hinzufügen, dass dies zwar eine Leistungsverbesserung gegenüber Ihrem ursprünglichen Code darstellt, die klassische Vorgehensweise jedoch noch schneller ist:

%Vor%

und nur marginal mehr wortreich.

Der Grund, warum es schneller ist, ist, dass die Lambda-Version den zusätzlichen Laufzeitaufwand zum Erstellen der aufrufbaren Instanz (Erfassungskosten) und eine zusätzliche Ebene von Methodenaufrufen aufweist.

Und schließlich gibt es das Problem, die LambdaLogger Instanzen zu erstellen. @ bobbels Code zeigt an, dass dies mit einem Konstruktor gemacht wird, aber in Wirklichkeit müssen java.util.logging.Logger Objekte durch eine Factory-Methode erstellt werden, um die Proliferation von Objekten zu vermeiden. Das bedeutet eine Menge zusätzlicher Infrastruktur (und Codeänderungen), damit dies mit einer benutzerdefinierten Unterklasse von Logger funktioniert.

    
Stephen C 13.02.2014 11:14
quelle
5

Erstellen Sie einfach Wrapper-Methoden für Ihren aktuellen Logger als:

%Vor%

und benutze es:

%Vor%

Referenz: JAVA SE 8 für das wirklich ungute eBook, Seiten 48-49.

    
mauretto 13.11.2014 11:15
quelle
5

Anscheinend enthält Log4j 2.4 Unterstützung für Lambda-Ausdrücke, die genau für Ihren Fall nützlich sind (und welche anderen Antworten manuell repliziert wurden):

Von Ссылка

%Vor%     
jhyot 29.06.2016 10:59
quelle
0

Verwenden Sie ein Format String und ein Array von Supplier<String> . Auf diese Weise werden keine toString -Methoden aufgerufen, es sei denn, der Protokolldatensatz ist tatsächlich publizierbar. Auf diese Weise müssen Sie sich nicht mit hässlichen if -Anweisungen über das Anmelden von Anwendungscode herumschlagen.

    
aepurniet 13.02.2014 18:55
quelle

Tags und Links