Używamy log4j za samodzielnie wykonanym opakowaniem. Planujemy teraz używać znacznie więcej funkcji.
Czy powinniśmy zaktualizować do wylogowania?
(Mam na myśli szkielet, a nie elewację jak SLF4J)
Używamy log4j za samodzielnie wykonanym opakowaniem. Planujemy teraz używać znacznie więcej funkcji.
Czy powinniśmy zaktualizować do wylogowania?
(Mam na myśli szkielet, a nie elewację jak SLF4J)
Odpowiedzi:
Logback natywnie implementuje SLF4J API. Oznacza to, że jeśli korzystasz z logowania zwrotnego, w rzeczywistości używasz SLF4J API. Teoretycznie można by bezpośrednio użyć wewnętrznego interfejsu API logowania do logowania, ale jest to wysoce odradzane. Cała dokumentacja logbacka i przykłady dotyczące rejestratorów są napisane pod kątem API SLF4J.
Więc używając logback, faktycznie używałbyś SLF4J i jeśli z jakiegoś powodu chciałbyś przełączyć się z powrotem na log4j, możesz to zrobić w ciągu kilku minut, po prostu upuszczając slf4j-log4j12.jar na ścieżkę klasy.
Podczas migracji z logback do log4j, wylogowuj określone części, szczególnie te zawarte w logback pliku konfiguracyjnym logback.xml , nadal musiałyby zostać przeniesione do jego odpowiednika log4j, tj . Log4j.properties . Podczas migracji w innym kierunku konfiguracja log4j, tj. Log4j.properties , musiałaby zostać przekonwertowana na jej odpowiednik logback. Jest do tego narzędzie online . Nakład pracy związany z migracją plików konfiguracyjnych jest znacznie mniejszy niż praca wymagana do migracji wywołań programu rejestrującego rozpowszechnionych w całym kodzie źródłowym oprogramowania i jego zależnościach.
Powinieneś? Tak .
Czemu? Log4J został zasadniczo wycofany przez Logback .
Czy to jest pilne? Może nie.
Czy to jest bezbolesne? Prawdopodobnie, ale może to zależeć od instrukcji logowania.
Zwróć uwagę, że jeśli naprawdę chcesz w pełni wykorzystać LogBack (lub SLF4J), to naprawdę musisz napisać odpowiednie instrukcje logowania . Zapewni to korzyści, takie jak szybszy kod z powodu leniwej oceny i mniej wierszy kodu, ponieważ można uniknąć strażników.
Na koniec bardzo polecam SLF4J. (Po co odtwarzać koło z własną fasadą?)
W świecie rejestrowania są fasady (takie jak Apache Commons Logging, slf4j lub nawet Log4j 2.0 API) i implementacje (Log4j 1 + 2, java.util.logging, TinyLog, Logback).
Zasadniczo powinieneś wymienić swój własny wrapper na slf4j IF i tylko wtedy, gdy nie jesteś z niego zadowolony z jakiegoś powodu. Podczas gdy Apache Commons Logging tak naprawdę nie zapewnia nowoczesnego API, zapewnia to slf4j i nowa fasada Log4j 2. Biorąc pod uwagę, że wiele aplikacji używa slf4j jako opakowania, może to mieć sens.
slf4j daje wiele fajnych cukierków API, jak ten przykład z dokumentów slf4j:
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
To podstawianie zmiennych. Jest to również obsługiwane przez Log4j 2.
Musisz jednak mieć świadomość, że slf4j został opracowany przez QOS, który również utrzymuje logback. Log4j 2.0 jest wypalany w Apache Software Foundation. W ciągu ostatnich trzech lat ponownie wyrosła tam tętniąca życiem i aktywna społeczność. Jeśli cenisz Open Source, tak jak robi to Apache Software Foundation ze wszystkimi jego gwarancjami, możesz ponownie rozważyć użycie slf4j na korzyść bezpośredniego użycia Log4j 2.
Proszę zanotować:
W przeszłości log4j 1 nie był aktywnie obsługiwany, podczas gdy Logback był. Ale dzisiaj jest inaczej. Log4j 2 jest aktywnie rozwijany i wydaje się prawie regularnie. Zawiera również wiele nowoczesnych funkcji, a -imho- czyni kilka rzeczy lepszymi niż Logback. Czasami jest to tylko kwestia gustu i powinieneś wyciągnąć własne wnioski.
Napisałem krótkie omówienie nowych funkcji Log4j 2.0: http://www.grobmeier.de/the-new-log4j-2-0-05122012.html
Podczas czytania zobaczysz, że Log4j 2 został zainspirowany Logbackiem, ale także innymi platformami rejestrowania. Ale podstawa kodu jest inna; prawie nic nie dzieli z Log4j 1 i zero z Logback. Doprowadziło to do pewnych ulepszeń, takich jak w przykładzie Log4j 2 działa ze strumieniami bajtowymi zamiast Strings pod maską. Nie traci też zdarzeń podczas rekonfiguracji.
Log4j 2 może logować się szybciej niż inne znane mi frameworki: http://www.grobmeier.de/log4j-2-performance-close-to-insane-20072013.html
Mimo to społeczność użytkowników wydaje się być znacznie większa niż Logbacki: http://www.grobmeier.de/apache-log4j-is-the-leading-logging-framework-06082013.html
Wszystko wskazuje na to, że najlepszym pomysłem jest wybranie struktur rejestrowania, które najlepiej pasują do tego, co chcesz osiągnąć. Nie przełączałbym pełnego frameworka, gdybym wyłączył logowanie w środowisku produkcyjnym i po prostu wykonał podstawowe logowanie w mojej aplikacji. Jeśli jednak robisz trochę więcej z logowaniem, po prostu spójrz na funkcje, które są dostarczane przez frameworki i ich twórców. Chociaż otrzymujesz komercyjne wsparcie dla Logback przez QOS (słyszałem), obecnie nie ma komercyjnego wsparcia dla Log4j 2. Z drugiej strony, jeśli potrzebujesz przeprowadzić rejestrację audytu i potrzebujesz wysokiej wydajności zapewnianej przez asynchroniczne programy dołączające, bardzo sensowne jest sprawdź log4j 2.
Należy pamiętać, pomimo całego komfortu, jaki zapewniają, fasady zawsze pochłaniają trochę wydajności. Być może nie ma to na ciebie żadnego wpływu, ale jeśli masz mało zasobów, być może będziesz musiał zapisać wszystko, co możesz mieć.
Bez lepszego poznania wymagań jest prawie niemożliwe udzielenie rekomendacji. Po prostu: nie zmieniaj tylko dlatego, że wiele osób się zmienia. Przełącz się tylko dlatego, że widzisz jego wartość. Argument, że log4j jest martwy, już się nie liczy. Żyje i jest gorąco.
ZRZECZENIE SIĘ: Obecnie jestem wiceprezesem Apache Logging Services i zajmuję się również log4j.
Nie do końca odpowiadając na twoje pytanie, ale gdybyś mógł odejść od własnej roboty wrappera, to istnieje Simple Logging Facade for Java (SLF4J), na który Hibernate się teraz przełączył (zamiast zwykłego logowania).
SLF4J nie cierpi z powodu żadnego z problemów z ładowaniem klas ani wycieków pamięci obserwowanych w Jakarta Commons Logging (JCL).
SLF4J obsługuje logowanie JDK, log4j i logback. Zatem przejście z log4j do logback powinno być dość łatwe w odpowiednim momencie.
Edycja: Aplogies, których nie wyraziłem jasno. Sugerowałem użycie SLF4J, aby odizolować się od konieczności dokonywania trudnego wyboru między log4j lub logback.
Twoja decyzja powinna być oparta na
Powinieneś oprzeć się pokusie zmiany interfejsów API tylko dlatego, że jest „nowszy, lśniący, lepszy”. Przestrzegam zasady „jeśli coś nie jest zepsute, nie kopaj”.
Jeśli Twoja aplikacja wymaga bardzo wyrafinowanej struktury rejestrowania, warto zastanowić się, dlaczego.
Dojrzały projekt lub nawet projekt znajdujący się głęboko w fazie rozwoju prawdopodobnie straciłby więcej niż zysk z takiej aktualizacji, IMHO. Logback jest z pewnością znacznie bardziej zaawansowany w szeregu punktów, ale nie w stopniu umożliwiającym całkowitą wymianę w działającym systemie. Z pewnością rozważałbym logowanie do nowego programu, ale istniejący log4j jest wystarczająco dobry i dojrzały dla wszystkiego, co już zostało wydane i spotkało użytkownika końcowego. To bardzo subiektywne, powinieneś sam zobaczyć koszty.