Próbuję użyć SLF4J (z log4j
wiązaniem) po raz pierwszy.
Chciałbym skonfigurować 3 różne nazwane Loggery, które mogą zostać zwrócone przez LoggerFactory, który będzie rejestrował różne poziomy i przekazywał wiadomości do różnych programów dołączających:
- Logger 1 „FileLogger” rejestruje DEBUG i dołącza do
DailyRollingFileAppender
- Logger 2 „TracingLogger” rejestruje TRACE + i dołącza do
JmsAppender
- Logger 3 „ErrorLogger” rejestruje BŁĄD + i dołącza do innego
JmsAppender
Ponadto chcę je skonfigurować programowo (w Javie, w przeciwieństwie do XML lub log4j.properties
pliku).
Wyobrażam sobie, że normalnie zdefiniowałbym je Logger
gdzieś w kodzie ładującym, jak init()
metoda. Ponieważ jednak chcę korzystać slf4j-log4j
, nie jestem pewien, gdzie mogę zdefiniować programy rejestrujące i udostępnić je ścieżce klasy.
Nie wierzę, że jest to naruszenie podstawowego celu SLF4J (jako fasady), ponieważ mój kod korzystający z interfejsu API SLF4J nigdy nie będzie wiedział, że te programy rejestrujące istnieją. Mój kod wykonuje zwykłe wywołania do interfejsu API SLF4J, który następnie przekazuje je do rejestratorów log4j, które znajdzie na ścieżce klasy.
Ale jak skonfigurować te log4j Loggery na ścieżce klas ... w Javie ?!
Odpowiedzi:
Możesz dodać / usunąć Appender programowo do Log4j:
Sugeruję umieszczenie go w init () gdzieś, gdzie masz pewność, że zostanie to wykonane zanim cokolwiek innego. Następnie możesz usunąć wszystkie istniejące programy dołączające z głównego programu rejestrującego za pomocą
i zacznij od dodania własnego. Aby to zadziałało, potrzebujesz log4j w ścieżce klas.
Uwaga:
Możesz wziąć dowolne
Logger.getLogger(...)
, aby dodać programy dołączające. Właśnie wziąłem główny rejestrator, ponieważ jest on na dole wszystkich rzeczy i będzie obsługiwał wszystko, co przechodzi przez inne programy dołączające w innych kategoriach (chyba że skonfigurowano inaczej przez ustawienie flagi addytywności).Jeśli chcesz wiedzieć, jak działa rejestrowanie i jak zdecydować, gdzie są zapisywane logi, przeczytaj ten podręcznik, aby uzyskać więcej informacji na ten temat.
W skrócie:
da ci logger dla kategorii „com.fizz”.
W powyższym przykładzie oznacza to, że wszystko, co się z nim zaloguje, będzie odsyłane do konsoli i programu dołączającego pliki w głównym programie rejestrującym.
Jeśli dodasz program dołączający do Logger.getLogger („com.fizz”). AddAppender (newAppender), wówczas logowanie z
fizz
będzie obsługiwane przez wszystkie programy dołączające z głównego loggera inewAppender
.Nie tworzysz rejestratorów z konfiguracją, po prostu udostępniasz moduły obsługi wszystkich możliwych kategorii w twoim systemie.
źródło
Logger fizz = LoggerFactory.getLogger("com.fizz");
Dzięki!Wygląda na to, że próbujesz użyć log4j z „obu końców” (od strony konsumenta i od konfiguracji).
Jeśli chcesz napisać kodowanie do interfejsu API slf4j, ale z góry określisz (i programowo) konfigurację rejestratorów log4j, że ścieżka klasy zwróci, absolutnie musisz mieć jakąś adaptację rejestrowania, która wykorzystuje leniwą konstrukcję.
Dzięki takiemu podejściu nie musisz się martwić o to, gdzie / kiedy zostaną skonfigurowane rejestratory log4j. Za pierwszym razem, gdy prosi o nie classpath, leniwie je konstruują, wracają i udostępniają przez slf4j. Mam nadzieję, że to pomogło!
źródło
W przypadku, gdy zdefiniowałeś moduł dołączający we właściwościach log4j i chciałbyś go zaktualizować programowo, ustaw nazwę we właściwościach log4j i uzyskaj ją według nazwy.
Oto przykładowy wpis log4j.properties:
Aby go zaktualizować, wykonaj następujące czynności:
źródło
Jeśli ktoś szuka programowej konfiguracji log4j2 w Javie, ten link może pomóc: ( https://www.studytonight.com/post/log4j2-programmatic-configuration-in-java-class )
Oto podstawowy kod do konfigurowania programu dołączającego do konsoli:
Spowoduje to zmianę konfiguracji domyślnego rootLoggera, a także utworzenie nowego programu dołączającego .
źródło