Ś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:
- 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:
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?