Wir haben unseren gesamten Code migriert, um slf4 apis zu verwenden, um generische API zu verwenden, aber jetzt denken wir über ein Upgrade von log4j 1.x auf log4j 2.x nach . Werden wir alle Funktionen von log4j2 nutzen können, wenn wir slf4j api und Implementierung als log4j2 verwenden?können wir alle Funktionen von log4j2 verwenden, wenn wir es zusammen mit slf4j api verwenden
Antwort
Die Log4j2-API ist reicher als die SLF4J-API, und viele Log4j2-API-Funktionen sind und nicht, die über SLF4J zugänglich sind. Siehe unten für Details.
Funktionen der Log4j2-Implementierung, wie Async-Logger, Lookups, Filter, Layouts und Appender, werden mit der Konfiguration gesteuert und sind unabhängig von der Logging-API, die Sie in Ihrer Anwendung verwenden.
Bitte beachten Sie auch diese answer zu der anderen aber verwandten Frage , warum es sicher ist, die Log4j2 API zu programmieren.
10 Log4j2 API Funktionen, die nicht in SLF4J
(1) Die Message API Anwendungen strukturierte Objekte zusätzlich zu nur Text protokollieren kann. Intern konvertiert Log4j2 alles, was in einer Nachricht protokolliert wird. Wenn Sie dies der API offen legen, eröffnen sich für Anwendungen alle Möglichkeiten, mit nachgelagerten Protokollierungskomponenten (Filtern, Layouts, Appendern) zu interagieren. Dies kann nützlich sein, wenn Sie benutzerdefinierte Komponenten als Plugins für Log4j2 entwickeln oder wenn Sie die integrierten Komponenten verwenden. Sehen Sie für ein eingebautes Beispiel, wie StructuredDataMessage für feinkörnige Kontrolle über Rfc5424Layout verwendet wird.
(2) Java 8 lambda support ermöglicht Ihnen das mühsame Erstellen von Parametern oder das Protokollieren von Nachrichten, ohne explizit zu prüfen, ob die angeforderte Protokollstufe aktiviert ist.
// Java-8 style optimization: no need to explicitly check the log level:
// the lambda expression is not evaluated if the TRACE level is not enabled
logger.trace("Some long-running operation returned {}",() -> expensiveOperation());
(3) Mischen {} -Stil Parameter mit String :: Format %s %d
-Stil Parameter. Der Stil {} hat eine bessere Leistung und kann mit jedem Parametertyp verwendet werden, aber der Stil printf
bietet eine feinkörnige Kontrolle über die Formatierung. Mit Log4j2 können Sie diese Parameter-Stile leicht mischen. Zum Beispiel:
logger.debug("Opening connection to {}...", someDataSource);
logger.printf(Level.INFO, "Logging in user %1$s with birthday %2$tm %2$te,%2$tY", user.getName(), user.getBirthdayCalendar());
(4) CloseableThreadContext bietet einige zusätzliche Bequemlichkeit über den normalen ThreadContext (MDC) in SLF4J: es Elemente automatisch entfernt, wenn Sie fertig sind. Zum Beispiel:
// Add to the ThreadContext map for this try block only;
try (final CloseableThreadContext.Instance ctc = CloseableThreadContext
.put("id", UUID.randomUUID().toString())
.put("loginId", session.getAttribute("loginId"))) {
logger.debug("Message 1");
// call some other code that also does logging
...
logger.debug("Message 2");
...
} // "is" and "loginId" are now removed from the ThreadContext map
(5) der Log4j2 ThreadContext, zusätzlich zu dem Schlüssel-Wert-Paaren, hat auch push
und pop
Methoden Stapel Funktionalität zu unterstützen (was früher NDC in Log4j 1 bezeichnet werden).
(6) SLF4J unterstützt die Protokollstufe FATAL nicht.
(7) Log4j2 unterstützt custom log levels. Diese können mit den Methoden log
verwendet werden, zum Beispiel: logger.log(Level.getLevel("FINE"), "... msg")
, oder Sie können einen benutzerdefinierten Logger-Wrapper mit Komfortmethoden für Ihre benutzerdefinierten Protokollebenen generieren.
(8) Die Log4j2-API akzeptiert jedes Objekt, nicht nur Strings. Dies ist einer der Dinge, die Log4j2 erlauben, "garbage-free" zu sein, was bedeutet, dass es vermeidet, neue Objekte zuzuweisen. Ihr Objekt wird protokolliert, ohne dass temporäre Zeichenfolgen erstellt werden, wenn es sich um eine Number, eine CharSequence oder um die Schnittstelle (Log4j2) StringBuilderFormattable handelt.
Die Log4j2-API vermeidet auch die Erstellung von vararg-Arrays, wenn Sie 10 Parameter oder weniger protokollieren. SLF4J erstellt Vararg-Arrays, wenn Sie mehr als 2 Parameter protokollieren.
(9) Die oben genannten erhalten Sie kostenlos, nur mit der Log4j2 API direkt. Wenn Sie darüber hinaus das Erstellen von temporären Objekten vermeiden möchten (wie bei einigen interaktiven Spielen und Finanzanwendungen mit niedriger Latenz), können Sie primitive Parameter mit der Unbox-Hilfsklasse automatisch einbetten.
(10) Die Verwendung der grobkörnigen Synchronisation durch SLF4J-Marker kann Auswirkungen auf die Leistung von Multi-Thread-Anwendungen haben (SLF4J-240). Weitere Informationen finden Sie im Abschnitt "Erweiterte Filterung" auf der Seite performance test results.
Haftungsausschluss: Ich Log4j2 beitragen.
- 1. Können wir Retrofit, RxJava, RxAndroid zusammen verwenden?
- 2. Warum verwenden wir pthread_exit(), wenn wir return verwenden können?
- 3. Können wir Rest API in ASP.Net verwenden?
- 4. Können wir multipart und @RequestBody im Frühling zusammen verwenden?
- 5. DynamoDB: Können wir Verschlüsselung und bereichsübergreifende Replikation zusammen verwenden?
- 6. können wir Spring Boot und Feder mvc 4 zusammen verwenden
- 7. Können wir reactJS mit amCharts verwenden
- 8. Können wir & in URL verwenden?
- 9. Können wir ngRoute und ui.router zusammen in angularJS app.js verwenden?
- 10. Wie verwenden wir Extension?
- 11. Können wir ein Array initialisieren, wenn wir es mit einem Strukturobjekt verwenden? | C#
- 12. Können wir Sikuli mit PhantomJS verwenden?
- 13. Warum die Parameter verwenden, wenn wir Variablen verwenden können?
- 14. Können wir Xpath mit BeautifulSoup verwenden?
- 15. Wie können wir MSHTML mit VBA verwenden?
- 16. Warum verwenden wir Serialisierung?
- 17. Warum müssen wir verwenden, außer und "?" zusammen statt, wenn allein
- 18. Können wir Highcharts mit React-Native verwenden?
- 19. können wir CASE mit EXEC verwenden
- 20. Können wir Multithreading-Konzept zusammen mit WatchService API in Java verwenden?
- 21. C#: Warum verwenden Generika nicht den allgemeinsten Typ, den wir verwenden können, wenn wir keinen angeben?
- 22. Können wir Listenansicht für heterogene Sammlungen verwenden
- 23. Wie können wir marketo SDK mit Marshmallow (API 23) verwenden, wenn Sie proguard verwenden?
- 24. Warum können wir das Schlüsselwort DISTINCT nicht verwenden, wenn wir den Operator ROLLUP verwenden?
- 25. Warum verwenden wir abroll segue, wenn wir Segmente verwenden können, um zu einem View-Controller zurückzukehren?
- 26. Wann verwenden wir POJO und wann verwenden wir SLSB
- 27. Android NDK: können wir C++ für alle Arbeiten verwenden
- 28. Wann können wir ClearAllPools-Methode verwenden?
- 29. Können wir Regex in Symfony2 Zugriffskontrolle verwenden?
- 30. Können wir Vuforia mit NativeActivity auf Android verwenden
Danke Remko für alle Imp. Punkte, auf die Sie hingewiesen haben. – Mayur
Bitte beachten Sie, dass SLF4J-240 wurde heute endgültig festgelegt und wird in SLF4J 1.7.24 sein. Haftungsausschluss - Ich trage auch zu Log4j 2 bei. – rgoers