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).
slf4j
i 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ć tylkojava.util.logging
w produkcji, co wtedy?Odpowiedzi:
Ś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-slf4j
moduł 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.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:
(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:
źródło
log4j-to-slf4j
zamiast tegolog4j-core
wybrać zależność i wybrać dowolną z wymienionych implementacji SLF4J. Liczba natywnych implementacji interfejsu API Log4j2 nie ma znaczenia.