Czy należy zalogować się z kodu biblioteki?

38

Jeśli opracowuję bibliotekę Java, czy dobrą praktyką jest wydawanie instrukcji dziennika z kodu biblioteki?

Logowanie w bibliotece sprawi, że debugowanie i rozwiązywanie problemów będzie bardziej przejrzyste. Jednak z drugiej strony nie lubię zaśmiecać mojego kodu biblioteki instrukcjami logowania. Czy należy wziąć pod uwagę także wpływ na wydajność?

duński
źródło

Odpowiedzi:

33

Tak, powinieneś. Korzystanie z fasady rejestrowania, takiej jak SLF4J, zapewnia elastyczność bez obciążania użytkowników konkretnymi ramami rejestrowania.

Autorzy szeroko rozpowszechnionych komponentów i bibliotek mogą kodować interfejs SLF4J, aby uniknąć narzucania struktury rejestrowania użytkownikowi końcowemu komponentu lub biblioteki. Tak więc użytkownik końcowy może wybrać pożądaną strukturę rejestrowania w czasie wdrażania, wstawiając odpowiednie wiązanie slf4j do ścieżki klasy, które można później zmienić, zastępując istniejące powiązanie innym wiązaniem na ścieżce klasy i ponownie uruchamiając aplikację. To podejście okazało się proste i bardzo solidne.

Ponadto, jeśli Twoi użytkownicy nie zawierają słoika SLF4J (z podręcznika użytkownika ):

Począwszy od wersji 1.6.0 SLF4J, jeśli nie znaleziono powiązania na ścieżce klasy, slf4j-api domyślnie implementuje brak operacji odrzucając wszystkie żądania dziennika.

Jeśli obawiasz się wpływu rejestrowania na wydajność, sprawdź ten wpis FAQ SLF4J . Chodzi o to, że podajesz parametry do rejestrowania instrukcji zamiast dodawać je do wbudowanego ciągu:

Następne dwa wiersze dadzą dokładnie taką samą wydajność. Jednak drugi formularz przewyższy pierwszy formularz o współczynnik co najmniej 30, w przypadku wyłączonej instrukcji rejestrowania.

logger.debug("The new entry is "+entry+".");
logger.debug("The new entry is {}.", entry);

Czy SLF4J to kolejna fasada zrębowa?

SLF4J jest koncepcyjnie bardzo podobny do JCL. Jako taki może być uważany za kolejną fasadę zrębową. Jednak SLF4J ma znacznie prostszą konstrukcję i jest prawdopodobnie bardziej wytrzymały. W skrócie, SLF4J unika problemów z modułami ładującymi klasy, które są plagą [Jakarta Commons Logging].

Mike Partridge
źródło
Czy istnieje dobra biblioteka open source, która loguje się w kodzie biblioteki, który można wskazać? abyśmy mogli zobaczyć, jak to się robi?
user1870400,
Framework Spring to dość znana biblioteka Java, która to robi; w ich przypadku wybrali JCL.
Mike Partridge,
17

Tak , powinieneś zalogować się ze swojego kodu biblioteki. Nie tylko pomaga ci się rozwijać, ale ludzie, którzy korzystają z biblioteki, uznają ją za przydatną. Pamiętaj, że zawsze możesz ustawić poziomy rejestrowania, aby wyświetlały tylko potrzebne instrukcje dziennika - i mogą zrobić to samo.

Ostatnio korzystałem z Mybatis , narzędzia ORM typu open source. Debugowałem problem, w którym zapytanie, które moim zdaniem powinno być poprawne, nie zwróciło żadnych wyników. To było sparametryzowane zapytanie, a ponieważ Mybatis loguje się w kodzie biblioteki, mogłem go włączyć i zobaczyć, jak aktualne zapytanie jest uruchamiane. Łatwo było powiedzieć, że zamieniłem dwa parametry. Bez zalogowania się w bibliotece nie mogłem znaleźć problemu tak szybko.

Michael K.
źródło