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).
slf4j
Logback (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 nurjava.util.logging
in der Produktion verwenden dürfen. Was dann?Antworten:
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-slf4j
Brückenmodul. Jede Anwendung, die gegen die Log4j2-API codiert ist, kann jederzeit die Sicherungsimplementierung auf eine slf4j-kompatible Implementierung umstellen.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:
(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:
quelle
log4j-to-slf4j
Abhängigkeit anstellelog4j-core
einer der von Ihnen erwähnten SLF4J-Implementierungen auswählen und auswählen. Die Anzahl der nativen Implementierungen der Log4j2-API spielt keine Rolle.