W przypadku korzystania z log4j Logger.log(Priority p, Object message)
metoda jest dostępna i może służyć do rejestrowania komunikatu na poziomie dziennika określonym w czasie wykonywania. Używamy tego faktu i tej wskazówki, aby przekierować stderr do rejestratora na określonym poziomie dziennika.
slf4j nie ma ogólnej log()
metody, którą mogę znaleźć. Czy to oznacza, że nie ma sposobu na wdrożenie powyższego?
slf4j 2.0
. jira.qos.ch/browse/SLF4J-124 Zobacz moją odpowiedź, aby uzyskać szczegółowe informacje i możliweslf4j 1.x
obejście.Odpowiedzi:
Nie da się tego zrobić
slf4j
.Wyobrażam sobie, że powodem braku tej funkcji jest to, że prawie niemożliwe jest skonstruowanie
Level
typu,slf4j
który można skutecznie odwzorować naLevel
(lub równoważny) typ używany we wszystkich możliwych implementacjach logowania za fasadą. Alternatywnie, projektanci zdecydowali, że Twój przypadek użycia jest zbyt nietypowy, aby uzasadnić koszty jego obsługi.Odnośnie @ ripper234 „s przypadków użycia (Unit Testing), myślę, że pragmatyczne rozwiązanie jest zmodyfikowanie testu (ów) Urządzenie do wiedzy trudno drutu jaki system rejestracji jest za fasadą slf4j ... podczas uruchamiania testów jednostkowych.
źródło
org.slf4j.Logger
: debug, error, info, trace, warn.Richard Fearn ma dobry pomysł, więc napisałem całą klasę w oparciu o jego szkieletowy kod. Mam nadzieję, że jest wystarczająco krótki, aby opublikować tutaj. Kopiuj i wklejaj dla przyjemności. Powinienem też chyba dodać jakieś magiczne zaklęcie: „Ten kod jest udostępniany publicznie”
źródło
Spróbuj przełączyć się na Logback i użyj
Wierzę, że będzie to jedyne wezwanie do Logback, a reszta twojego kodu pozostanie niezmieniona. Logback używa SLF4J, a migracja będzie bezbolesna, wystarczy zmienić pliki konfiguracyjne xml.
Pamiętaj, aby po zakończeniu ustawić ponownie poziom dziennika.
źródło
Możesz to zaimplementować za pomocą lambd Java 8.
źródło
LevelLogger
), co nie jest dobrą rzeczą, ponieważ jest to ogólnie bardzo przydatna informacja.Można to zrobić za
enum
pomocą metody i pomocnika:Możesz dodać inne warianty
log
, powiedzmy, jeśli chcesz generycznych odpowiedników 1-parametrowego lub 2-parametrowego SLF4Jwarn
/error
/ etc. metody.źródło
Każdy, kto chce w pełni kompatybilnego z SLF4J rozwiązania tego problemu, może chcieć wypróbować Lidalia SLF4J Extensions - jest na Maven Central.
źródło
Po prostu potrzebowałem czegoś takiego i wymyśliłem:
stosowanie:
Rejestrator jest przekazywany podczas wywołania, więc informacje o klasie powinny być w porządku i dobrze współpracuje z adnotacją @ Slf4j lombok.
źródło
DEBUG
brakuje jako stałe.LogLevel
jako klasa ilog
metoda, co sprawia, że dzienniki są mniej sensowne.To nie możliwe, aby określić poziom dziennika w sjf4j
1.x
po wyjęciu z pudełka. Ale jest nadzieja, że slf4j2.0
naprawi problem . W wersji 2.0 może to wyglądać tak:W międzyczasie w przypadku slf4j 1.x możesz zastosować to obejście:
Skopiuj tę klasę do swojej ścieżki klas:
Następnie możesz go użyć w ten sposób:
Spowoduje to wyświetlenie następującego dziennika:
Czy warto?
LogLevel
Kod źródłowy jako minimalny przykład jest hostowany na GitHub .
źródło
LogMethod
interfejs musi być publiczny, aby działał z klasami spoza pakietu. Poza tym działa zgodnie z przeznaczeniem. Dzięki!Nie jest możliwe za pomocą slf4j API, aby dynamicznie zmieniać poziom logowania, ale możesz skonfigurować logback (jeśli używasz tego) samodzielnie. W takim przypadku utwórz klasę fabryczną dla swojego rejestratora i zaimplementuj główny program rejestrujący z potrzebną konfiguracją.
Po skonfigurowaniu głównego programu rejestrującego (wystarczy tylko jeden raz) możesz delegować pobieranie nowego rejestratora przez
Pamiętaj, aby użyć tego samego
loggerContext
.Zmiana poziomu dziennika jest łatwa do zrobienia za pomocą głównego programu rejestrującego podanego z
loggerContext
.źródło
Potwierdź odpowiedź Ondrej Skopek
Otrzymasz wynik:
źródło
Właśnie spotkałem się z podobną potrzebą. W moim przypadku slf4j jest skonfigurowany z adapterem logującym java (jdk14). Korzystając z następującego fragmentu kodu, udało mi się zmienić poziom debugowania w czasie wykonywania:
źródło
Opierając się na odpowiedzi Massimo virgilio, udało mi się to również zrobić za pomocą slf4j-log4j przy użyciu introspekcji. HTH.
źródło
Oto rozwiązanie lambda, które nie jest tak przyjazne dla użytkownika, jak @Paul Croarkin w jednym kierunku (poziom jest skutecznie przekazywany dwukrotnie). Ale myślę, że (a) użytkownik powinien przekazać Logger; oraz (b) AFAIU, pierwotne pytanie nie dotyczyło wygodnego sposobu dla wszystkich elementów aplikacji, a jedynie sytuacji, w której w bibliotece jest niewiele zastosowań.
Ponieważ slf4j zezwala na Throwable (którego ślad stosu powinien być rejestrowany) wewnątrz parametru varargs , myślę, że nie ma potrzeby przeciążania
log
metody pomocniczej dla innych konsumentów niż(String, Object[])
.źródło
Udało mi się to zrobić dla powiązania JDK14, najpierw żądając instancji SLF4J Logger, a następnie ustawiając poziom wiązania - możesz spróbować tego dla powiązania Log4J.
źródło
Metoda, której używam, polega na zaimportowaniu modułów ch.qos.logback, a następnie przesłaniu instancji programu slf4j Logger do ch.qos.logback.classic.Logger. Ta instancja zawiera metodę setLevel ().
Aby poznać możliwe poziomy rejestrowania, możesz rozbić klasę ch.qos.logback, aby zobaczyć wszystkie możliwe wartości poziomu :
Wyniki są następujące:
źródło
używając introspekcji java możesz to zrobić, na przykład:
źródło
nie, ma wiele metod, info (), debug (), warn () itp. (to zastępuje pole priorytetu)
zajrzyj na http://www.slf4j.org/api/org/slf4j/Logger.html, aby uzyskać pełny interfejs API Loggera.
źródło