Lohnt es sich, slf4j mit log4j2 zu verwenden?

114

Ich kann mich nicht entscheiden, ob ich slf4j mit log4j2 verwenden möchte oder nicht. Basierend auf Online-Posts sieht es nicht so aus, als würde es einen Leistungseinbruch haben, aber es ist wirklich erforderlich.

Auch diese Punkte sprechen für log4j2:

  • SLF4J zwingt Ihre Anwendung, Zeichenfolgen zu protokollieren. Die Log4j 2-API unterstützt die Protokollierung von CharSequence, wenn Sie Text protokollieren möchten, unterstützt jedoch auch die Protokollierung von Objekten wie sie sind.
  • Die Log4j 2-API bietet Unterstützung für die Protokollierung von Nachrichtenobjekten, Java 8-Lambda-Ausdrücken und die fehlerfreie Protokollierung (sie vermeidet das Erstellen von Vararg-Arrays und das Erstellen von Strings beim Protokollieren von CharSequence-Objekten).
Andy897
quelle
2
Vielleicht. Was ist, wenn mein Anwendungsserver ein slf4jLogback (oder log4jv1) enthält? Sollte ich dann gezwungen sein, einen dritten Logger zu installieren, um Ihre Anwendung zu verwenden? Oder vielleicht entscheidet die Unternehmenssicherheit, dass Sie sie nur java.util.loggingin der Produktion verwenden dürfen. Was dann?
Elliott Frisch
Danke für's schreiben. Wenn jedoch jeder log4j org wide verwendet, gilt das obige Argument nicht.
Andy897
4
Die Verwendung von SLF4J bedeutet, dass das Ersetzen der Implementierung sehr einfach ist, wenn sich Unternehmensrichtlinien ändern, z. B. wenn Ihr Unternehmen erworben wird und Ihnen neue Richtlinien aufgezwungen werden. Die Verwendung von SLF4J beim Schreiben des Codes dauert nicht länger als die direkte Verwendung von Log4j. Das spätere Ersetzen direkter Log4j-Aufrufe nimmt viel Zeit in Anspruch. SLF4J ist eine kostenlose Investition / Versicherung für die Zukunft. Ist das wichtiger als die Log4j 2 API-Funktionen? Das können nur Sie (oder die Unternehmensrichtlinien) entscheiden.
Andreas
Gibt es überhaupt eine Möglichkeit, slf4j mit log4j2 zu verwenden, wenn Sie möchten? Diese Seite zeigt die Verwendung mit log4j (Version 1.2 (Ende der Lebensdauer), jedoch keine Option für log4j2. Wenn es einen Weg gibt, warum erwähnt slf4j ihn nicht?
J Woodchuck

Antworten:

160

Fahren Sie fort: Programmieren Sie auf die log4j2-API anstelle von slf4j

Es ist sicher: Die Log4j2-API bietet genau die gleichen Garantien wie slf4j - und mehr.

Nachdem Log4j2 selbst in eine API und ein Implementierungsmodul unterteilt ist, hat die Verwendung von SLF4J keinen Wert mehr.

Ja, es ist eine gute technische Praxis, Ihre Optionen offen zu halten. Möglicherweise möchten Sie später zu einer anderen Protokollierungsimplementierung wechseln.

In den letzten 10 Jahren bedeutete der Aufbau einer solchen Flexibilität in Ihrer Anwendung die Verwendung einer Wrapper-API wie SLF4J. Diese Flexibilität ist jedoch nicht kostenlos: Der Nachteil dieses Ansatzes besteht darin, dass Ihre Anwendung den umfangreicheren Funktionsumfang der zugrunde liegenden Protokollierungsbibliothek nicht verwenden kann.

Log4j2 bietet eine Lösung, bei der Ihre Anwendung nicht auf den kleinsten gemeinsamen Nenner beschränkt sein muss.

Das Auslassventil: log4j-to-slf4j

Log4j2 enthält ein log4j-to-slf4jBrückenmodul. Jede Anwendung, die gegen die Log4j2-API codiert ist, kann jederzeit die Sicherungsimplementierung auf eine slf4j-kompatible Implementierung umstellen.

log4j-to-slf4j

Wie in der Frage erwähnt, bietet die Verwendung der Log4j2-API direkt mehr Funktionalität und hat einige nicht funktionale Vorteile gegenüber der Verwendung einer Wrapper-API wie slf4j:

  • Nachrichten-API
  • Lambdas für faulen Holzeinschlag
  • Protokollieren Sie jedes Objekt anstatt nur Zeichenfolgen
  • Müllfrei: Vermeiden Sie nach Möglichkeit das Erstellen von Varargs oder Strings
  • CloseableThreadContext entfernt automatisch Elemente aus dem MDC, wenn Sie damit fertig sind

(Weitere Informationen finden Sie unter 10 Log4j2-API-Funktionen, die in SLF4J nicht verfügbar sind .)

Anwendungen können diese umfangreichen Funktionen der Log4j2-API sicher verwenden, ohne an die native Log4j2-Kernimplementierung gebunden zu sein.

SLF4J ist immer noch Ihr Sicherheitsventil. Es bedeutet nur nicht, dass Ihre Anwendung mehr gegen die SLF4J-API codieren sollte.


Offenlegung: Ich trage zu Log4j2 bei.


Update: Es scheint einige Verwirrung zu geben, dass die Programmierung auf die Log4j2-API irgendwie eine "Fassade für eine Fassade" einführt. In dieser Hinsicht gibt es keinen Unterschied zwischen der Log4j2-API und SLF4J.

Beide APIs erfordern 2 Abhängigkeiten bei Verwendung einer nativen Implementierung und 4 Abhängigkeiten bei einer nicht nativen Implementierung. SLF4J und die Log4j2-API sind in dieser Hinsicht identisch. Beispielsweise:

Erforderliche Abhängigkeiten sind für SLF4J und die Log4j 2-API ähnlich

Remko Popma
quelle
7
Ich verstehe. Lassen Sie mich meine Frage umformulieren. Gibt es andere unabhängige Implementierungen der log4j2-API als log4j2?
Ceki
5
Die Log4j2-API und impl sind nicht "eng miteinander verbunden". Alle diese SLF4J-Implementierungen sind verfügbar: Eine Anwendung, die für die Log4j2-API codiert ist, kann die log4j-to-slf4jAbhängigkeit anstelle log4j-coreeiner der von Ihnen erwähnten SLF4J-Implementierungen auswählen und auswählen. Die Anzahl der nativen Implementierungen der Log4j2-API spielt keine Rolle.
Remko Popma
19
Das Problem ist, dass Sie häufig Abhängigkeiten von Bibliotheken haben, die selbst slf4j verwenden. Es ist also einfacher, sich daran zu halten.
Davio
18
Also sollte ich eine Schnittstelle für eine Schnittstelle für eine Implementierung verwenden? Ja, nein danke ... Slf4j hat log4j geschlagen, indem es eine gute Schnittstelle zur Implementierung für die Protokollierung bietet ... log4j2 sollte nur die slf4j-API implementieren - wenn eine Funktion fehlt, tragen Sie sie zurück, wenn slf4j die neue nicht übernimmt Feature, dann gibt es vielleicht einen Fall für log4j2 API-Schnittstellen ....
RockMeetHardplace
4
@RemkoPopma - Sie sprechen sich immer noch gegen die Verwendung der log4j-Schnittstelle aus. Ja, ich verstehe - ich kann die Schnittstelle von log4j2 verketten -> die Schnittstelle von slf4j -> welche Implementierung auch immer, aber ich möchte die Abstraktion lieber nicht abstrahieren - danke, aber nein danke.
RockMeetHardplace