2017-01-13 43 views

Odpowiedz

26

Interfejs API Log4j2 jest bogatszy niż interfejs API SLF4J, a wiele funkcji interfejsu API Log4j2 to , a nie dostępnych za pośrednictwem SLF4J. Zobacz poniżej, aby uzyskać szczegółowe informacje.

Funkcje implementacji Log4j2, takie jak rejestratory asynchroniczne, odnośniki, filtry, układy i dodatki są kontrolowane za pomocą konfiguracji i są dostępne niezależnie od interfejsu API do rejestrowania używanego w aplikacji.

Prosimy również zapoznać się z tym answer dla innego, ale pokrewnego pytania na temat , dlaczego można bezpiecznie programować do Log4j2 API.

10 Log4j2 API funkcje niedostępne w slf4j

(1) Message API umożliwia aplikacjom zalogować strukturyzowanych obiektów oprócz tylko tekst. Wewnętrznie Log4j2 konwertuje wszystko, co jest zalogowane do wiadomości, a udostępnienie tego interfejsu API otwiera wiele różnych możliwości aplikacji do interakcji z komponentami rejestrowania dalszego przetwarzania (filtry, układy, aplikacje). Może to być przydatne, jeśli tworzysz komponenty niestandardowe jako wtyczki do Log4j2, a także gdy używasz wbudowanych. Aby uzyskać wbudowany przykład, zobacz, w jaki sposób StructuredDataMessage jest używany do dokładnej kontroli nad Rfc5424Layout.

(2) Java 8 lambda support umożliwia leniwe tworzenie parametrów lub protokołowanie komunikatów bez jawnego sprawdzania, czy wymagany poziom protokołu jest włączony.

// 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) do mieszania {} -Style parametry sznurkiem :: Forma %s %d -Style parametrów. Styl {} ma lepszą wydajność i może być używany z dowolnym typem parametru, ale styl printf zapewnia precyzyjną kontrolę nad formatowaniem. Log4j2 pozwala łatwo mieszać te style parametrów. Na przykład:

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 oferuje kilka dodatkowych wygodę nad normalnym ThreadContext (MDC) w slf4j: automatycznie usuwa elementy, kiedy skończysz. Na przykład:

// 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) Log4j2 na ThreadContext oprócz par klucz-wartość, ma również push i pop metody wspierają funkcjonalności stosu (co zwykło się nazywać NDC w Log4j 1).

(6) SLF4J nie obsługuje poziomu logicznego FATAL.

(7) Log4j2 ma wsparcie dla custom log levels. Mogą one być używane z metodami log, na przykład: logger.log(Level.getLevel("FINE"), "... msg"), lub można wygenerować niestandardową osłonę rejestratora za pomocą wygodnych metod dla niestandardowych poziomów dziennika.

(8) Interfejs API Log4j2 akceptuje dowolny obiekt, a nie tylko ciągi znaków. Jest to jedna z rzeczy, które pozwalają Log4j2 na "garbage-free", co oznacza, że ​​uniknie przydziału nowych Obiektów. Twój obiekt jest rejestrowany bez tworzenia żadnych tymczasowych ciągów znaków, jeśli jest to liczba, wartość CharSequence lub gdy implementuje interfejs (Log4j2) StringBuilderFormattable.

Interfejs API Log4j2 pozwoli także uniknąć tworzenia tablic vararg, jeśli zalogujesz 10 parametrów lub mniej. SLF4J tworzy tablice vararg, jeśli logujesz więcej niż 2 parametry.

(9) Powyższe można uzyskać za darmo tylko za pomocą interfejsu API Log4j2 bezpośrednio. Co więcej, jeśli naprawdę zależy Ci na unikaniu tworzenia tymczasowych obiektów (jak niektóre interaktywne gry i aplikacje finansowe o małym opóźnieniu), możesz uniknąć prymitywnych parametrów auto-boxingu za pomocą klasy narzędziowej Unbox.

(10) SLF4J Wykorzystanie synchronizacji gruboziarnistej Markerów może mieć wpływ na wydajność aplikacji wielowątkowych (SLF4J-240). Zobacz sekcję Zaawansowane filtrowanie na tej stronie performance test results.


Nota prawna: Przyczyniam się do Log4j2.

+0

Dziękuję Remko za cały imp. punkty, które wskazałeś. – Mayur

+0

Należy pamiętać, że SLF4J-240 został ostatecznie naprawiony dzisiaj i będzie w SLF4J 1.7.24. Zastrzeżenie - przyczyniam się również do Log4j 2. – rgoers