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).
Author: Remko Popma, 2017-01-06

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.

log4j-to-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
Aby uzyskać więcej informacji, zobacz 10 funkcje interfejsu API Log4j2 niedostępne w SLF4J.)

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:

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

 77
Author: Remko Popma,
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