2017-01-13 10 views

Antwort

26

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.

+0

Danke Remko für alle Imp. Punkte, auf die Sie hingewiesen haben. – Mayur

+0

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

Verwandte Themen