Czy warto używać slf4j z log4j2

114

Nie jestem w stanie zdecydować, czy używać slf4j czy nie z log4j2. Opierając się na postach online, nie wygląda na to, żeby miał jakikolwiek wpływ na wydajność, ale czy jest to naprawdę wymagane.

Te punkty również przemawiają na korzyść log4j2:

  • SLF4J wymusza na aplikacji rejestrowanie ciągów znaków. Interfejs API Log4j 2 obsługuje rejestrowanie dowolnego CharSequence, jeśli chcesz rejestrować tekst, ale obsługuje również rejestrowanie dowolnego obiektu w obecnej postaci.
  • Log4j 2 API oferuje obsługę rejestrowania obiektów Message, wyrażeń lambda Java 8 i rejestrowania bez śmieci (pozwala uniknąć tworzenia tablic vararg i tworzenia ciągów znaków podczas rejestrowania obiektów CharSequence).
Andy897
źródło
2
Może. Co się stanie, jeśli mój serwer aplikacji zawiera slf4ji wylogowuje (lub log4jv1)? Czy w takim razie powinienem być zmuszony do zainstalowania trzeciego rejestratora, aby móc korzystać z Twojej aplikacji? A może korporacyjne bezpieczeństwo decyduje, że możesz używać tylko java.util.loggingw produkcji, co wtedy?
Elliott Frisch
Dziękuję za napisanie. Ale jeśli każdy używa log4j org wide, powyższy argument nie będzie ważny.
Andy897
4
Korzystanie z SLF4J oznacza, że ​​wymiana wdrożenia jest bardzo łatwa, jeśli zmieni się polityka firmy, np. Gdy Twoja firma zostanie przejęta i narzucona zostanie nowa polityka. Używanie SLF4J teraz, kiedy piszesz kod, nie zajmie więcej czasu niż bezpośrednie użycie Log4j. Zastąpienie bezpośrednich wywołań Log4j później zajmie dużo czasu. SLF4J to bezpłatna inwestycja / ubezpieczenie na przyszłość. Czy to ważniejsze niż funkcje Log4j 2 API? Tylko Ty (lub polityka firmy) możesz o tym zdecydować.
Andreas,
Czy jest jakiś sposób na użycie slf4j z log4j2, jeśli chcesz? Ta strona pokazuje użycie z log4j - wersja 1.2 - co oznacza koniec życia), ale nie ma opcji dla log4j2. Jeśli istnieje sposób, dlaczego slf4j o tym nie wspomina?
J Woodchuck,

Odpowiedzi:

162

Śmiało: programuj do interfejsu API log4j2 zamiast slf4j

To bezpieczne: interfejs API Log4j2 oferuje dokładnie te same gwarancje co slf4j - a nawet więcej.

Teraz, gdy sam Log4j2 jest podzielony na API i moduł implementacji, używanie SLF4J nie ma już żadnej wartości.

Tak, dobrą praktyką inżynierską jest pozostawienie otwartych opcji. Możesz później zmienić na inną implementację rejestrowania.

Przez ostatnie 10 lat budowanie takiej elastyczności w aplikacji oznaczało używanie API wrappera, takiego jak SLF4J. Ta elastyczność nie jest jednak bezpłatna: Wadą tego podejścia jest to, że aplikacja nie może korzystać z bogatszego zestawu funkcji podstawowej biblioteki rejestrowania.

Log4j2 oferuje rozwiązanie, które nie wymaga, aby aplikacja była ograniczona do najniższego wspólnego mianownika.

Zawór ewakuacyjny: log4j-to-slf4j

Log4j2 zawiera log4j-to-slf4jmoduł mostkowy. Każda aplikacja zakodowana w interfejsie API Log4j2 może w dowolnym momencie przełączyć implementację wspierającą na dowolną implementację zgodną ze standardem slf4j.

log4j-to-slf4j

Jak wspomniano w pytaniu, bezpośrednie korzystanie z Log4j2 API oferuje większą funkcjonalność i ma pewne niefunkcjonalne zalety w porównaniu z opakowaniem API, takim jak slf4j:

  • Message API
  • Lambdy do leniwego logowania
  • Rejestruj dowolny obiekt zamiast tylko ciągów znaków
  • Bez śmieci: unikaj tworzenia varargów lub tworzenia ciągów, jeśli to możliwe
  • CloseableThreadContext automatycznie usuwa elementy z MDC, gdy skończysz z nimi

(Zobacz 10 Funkcje API Log4j2 niedostępne w SLF4J uzyskać więcej informacji, ).

Aplikacje mogą bezpiecznie korzystać z tych bogatych funkcji interfejsu API Log4j2 bez konieczności ograniczania się do natywnej implementacji rdzenia Log4j2.

SLF4J nadal jest Twoim zaworem bezpieczeństwa, nie oznacza to tylko, że Twoja aplikacja powinna już kodować w oparciu o SLF4J API.


Ujawnienie: współtworzę Log4j2.


Aktualizacja: Wydaje się, że jest pewne zamieszanie, że programowanie w API Log4j2 w jakiś sposób wprowadza „fasadę fasady”. Pod tym względem nie ma różnicy między API Log4j2 a SLF4J.

Oba interfejsy API wymagają 2 zależności w przypadku korzystania z implementacji natywnej i 4 zależności w przypadku implementacji innej niż natywna. SLF4J i Log4j2 API są pod tym względem identyczne. Na przykład:

Wymagane zależności są podobne dla SLF4J i Log4j 2 API

Remko Popma
źródło
7
Rozumiem. Pozwólcie, że przeformułuję moje pytanie. Czy istnieją niezależne implementacje API log4j2 inne niż log4j2?
Ceki,
5
Log4j2 API i impl nie są „ściśle powiązane”. Wszystkie te implementacje SLF4J są dostępne: aplikacja zakodowana w oparciu o Log4j2 API może log4j-to-slf4jzamiast tego log4j-corewybrać zależność i wybrać dowolną z wymienionych implementacji SLF4J. Liczba natywnych implementacji interfejsu API Log4j2 nie ma znaczenia.
Remko Popma
19
Problem polega na tym, że często masz zależności od bibliotek, które same używają slf4j, więc łatwiej jest po prostu się tego trzymać.
Davio,
18
więc powinienem użyć interfejsu dla interfejsu do implementacji? Tak, nie, dziękuję ... Slf4j pokonał log4j na szczyt, zapewniając dobry interfejs do implementacji do logowania ... log4j2 powinien po prostu zaimplementować slf4j api - jeśli brakuje funkcji, oddaj ją, jeśli slf4j nie weźmie nowego funkcja, to MOŻE istnieje przypadek dla interfejsów log4j2 api ....
RockMeetHardplace
4
@RemkoPopma - nadal jesteś zwolennikiem używania interfejsu log4j. Tak, rozumiem - mogę połączyć interfejs log4j2 -> interfejs slf4j -> jakakolwiek implementacja, ale wolałbym nie streszczać abstrakcji - dzięki, ale nie, dziękuję.
RockMeetHardplace