Czy warto używać slf4j z log4j2
Nie jestem w stanie zdecydować, czy użyć slf4j czy nie z log4j2. Na podstawie postów online nie wygląda na to, że będzie miał jakikolwiek hit wydajności, ale czy jest to naprawdę wymagane.
Również te punkty rządzą na korzyść log4j2:
- SLF4J zmusza Twoją aplikację do logowania łańcuchów. Interfejs API Log4j 2 obsługuje rejestrowanie dowolnych znaków, jeśli chcesz logować tekst, ale obsługuje również rejestrowanie dowolnego obiektu w stanie, w jakim jest.
- Log4j 2 API oferuje obsługę rejestrowania obiektów komunikatów, Java 8 lambda wyrażenia i bezproblemowe logowanie (unika tworzenia tablic vararg i unika tworzenia łańcuchów podczas logowania obiektów CharSequence).
1 answers
Śmiało: program do log4j2 API zamiast slf4j
to bezpieczne: Log4j2 API oferuje dokładnie takie same gwarancje jak slf4j-i nie tylko.
Teraz, gdy Log4j2 jest rozdzielony na API i moduł implementacyjny, nie ma już żadnej wartości w użyciu SLF4J.
Tak, dobrą praktyką inżynierską jest utrzymywanie otwartych opcji. Możesz chcieć zmienić na inną implementację logowania później.Przez ostatnie 10 lat, budując taka elastyczność w Twojej aplikacji oznaczała użycie API owijania, takiego jak SLF4J. ta elastyczność nie jest jednak Darmowa: wadą tego podejścia jest to, że Twoja aplikacja nie może korzystać z bogatszego zestawu funkcji bazowej biblioteki logowania.
Log4j2 oferuje rozwiązanie, które nie wymaga, aby Twoja aplikacja była ograniczona do najniższego wspólnego mianownika.
Zawór spustowy: log4j-to-slf4j
Log4j2 zawiera log4j-to-slf4j
moduł mostkowy. Dowolna aplikacja kodowane w oparciu o interfejs API Log4j2 mogą w dowolnym momencie przełączać implementację wspierającą na dowolną implementację zgodną z slf4j.
Jak wspomniano w pytaniu, korzystanie z API Log4j2 bezpośrednio oferuje więcej funkcjonalności i ma pewne niefunkcjonalne zalety w porównaniu z używaniem API owijarki, takiego jak slf4j:
- Message API
- Lambda dla leniwego logowania
- Zaloguj dowolny obiekt zamiast tylko łańcuchów
- bez śmieci: unikaj tworzenia varargs lub tworzenie łańcuchów w miarę możliwości
- CloseableThreadContext automatycznie usuwa elementy z MDC po ich zakończeniu
Aplikacje mogą bezpiecznie korzystać z tych bogatych funkcji interfejsu Log4j2 API bez blokowania się w natywnej implementacji Log4j2.
SLF4J jest nadal zaworem bezpieczeństwa, to po prostu nie znaczy, że aplikacja powinna kodować przeciwko API SLF4J
Zastrzeżenie: przyczyniam się do Log4j2.
Update: wydaje się być pewne zamieszanie, że programowanie do Log4j2 API w jakiś sposób wprowadza "fasadę dla fasadę". Nie ma różnicy w tym zakresie między Log4j2 API i SLF4J.
Oba interfejsy API wymagają 2 zależności w przypadku implementacji natywnej i 4 zależności w przypadku implementacji nie natywnej. SLF4J i Log4j2 API są pod tym względem identyczne. Na przykład:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 09:55:57