Użyto Hibernate 3.x. slf4jdo logowania. Hibernate 4.x używajboss-logging. Piszę samodzielną aplikację, która używa Hibernate 4 i SLF4J do logowania.
Jak mogę skonfigurować Hibernację, aby logowała się do SLF4J?
Jeśli nie jest to możliwe, jak w ogóle mogę skonfigurować logowanie Hibernate?
Sekcja podręcznika Hibernate 4.1 dotycząca logowania zaczyna się od ostrzeżenia, że jest to ...
Całkowicie nieaktualny. Hibernate korzysta z JBoss Logging począwszy od wersji 4.0. Zostanie to udokumentowane, gdy przeniesiemy tę zawartość do Podręcznika programisty.
... dalej mówi o SLF4J, więc jest bezużyteczny. Ani przewodnik dla początkujących, ani przewodnik dla programistów w ogóle nie mówią o logowaniu. Nie ma też tego przewodnik po migracji .
Szukałem dokumentacji na temat samego jboss-logging, ale w ogóle nie mogłem znaleźć. Strona GitHub jest cicha , a na stronie projektów społeczności JBoss nie ma nawet listy logowania jboss. Zastanawiałem się, czy program do śledzenia błędów projektu może mieć jakieś problemy związane z dostarczaniem dokumentacji, ale tak nie jest.
Dobra wiadomość jest taka, że podczas korzystania z Hibernate 4 na serwerze aplikacji, takim jak JBoss AS7, logowanie jest w dużej mierze obsługiwane za Ciebie. Ale jak mogę to skonfigurować w samodzielnej aplikacji?
źródło
Odpowiedzi:
Spójrz na https://github.com/jboss-logging/jboss-logging/blob/master/src/main/java/org/jboss/logging/LoggerProviders.java :
Więc możliwe wartości
org.jboss.logging.provider
to:jboss
,jdk
,log4j
,slf4j
.Jeśli nie ustawisz
org.jboss.logging.provider
, spróbuje jboss, następnie log4j, następnie slf4j (tylko jeśli używane jest logowanie) i powrót do jdk.Używam
slf4j
zlogback-classic
:i wszystko działa dobrze!
AKTUALIZACJA Niektórzy użytkownicy używają w bardzo głównym App.java:
ale w przypadku rozwiązań opartych na kontenerach to nie działa.
UPDATE 2 Ci, którzy myślą, że zarządzają Log4j z SLF4J, bo
jboss-logging
tak nie jest.jboss-logging
bezpośrednio używa Log4j bez SLF4J!źródło
org.jboss.logging.provider
?System.getProperty(LOGGING_PROVIDER_KEY);
potrzebami należy ustawić właściwość systemową. Przejrzyjjava -D...=...
lub sprawdź dokumenty swojego kontenera.Aby SLF4J współpracował z JBoss Logging bez Logback jako backend, wymaga użycia właściwości systemowej
org.jboss.logging.provider=slf4j
.log4j-over-slf4j
Wydaje się, że taktyka nie działa w tym przypadku, ponieważ logowanie powróci do JDK, jeśli ani Logback, ani log4j nie są obecne w ścieżce klas.Jest to trochę uciążliwe i aby autodetekcja działała, musisz zobaczyć, że program ładujący klasy zawiera przynajmniej
ch.qos.logback.classic.Logger
z logback-classic luborg.apache.log4j.Hierarchy
z log4j, aby oszukać JBoss Logging, aby nie cofnął się do logowania JDK.Magia jest interpretowana na
org.jboss.logging.LoggerProviders
AKTUALIZACJA: Dodano obsługę modułu ładującego usługi, dzięki czemu można uniknąć problemów z automatycznym wykrywaniem poprzez zadeklarowanie
META-INF/services/org.jboss.logging.LoggerProvider
(org.jboss.logging.Slf4jLoggerProvider
jako wartość). Wydaje się, że dodano również obsługę log4j2.źródło
-Dorg.jboss.logging.provider=slf4j
wystarczy przełącznik wiersza poleceń . LoggingProviders.java zapewnia lepszy wgląd w to, jakie są obecnie akceptowane wartości i czego można się spodziewać w ścieżce klas.Slf4jLoggerProvider
nie jestpublic
klasą?Zainspirowany postem Leif's Hypoport , w ten sposób „ wygiąłem ” Hibernate 4 z powrotem do slf4j:
Załóżmy, że używasz Mavena.
org.slf4j:log4j-over-slf4j
jako zależność do swojegopom.xml
mvn dependency:tree
, upewnij się, że żaden z artefaktów, których używaszslf4j:slf4j
, nie jest zależny od (a dokładniej, żaden artefakt nie może mieć zależności zakresu kompilacji ani zależności zakresu czasu wykonywaniaslf4j:slf4j
)Tło: Hibernate 4.x jest zależne od artefaktu
org.jboss.logging:jboss-logging
. Przejściowo ten artefakt ma podaną zależność zakresu od artefaktuslf4j:slf4j
.Ponieważ dodaliśmy teraz
org.slf4j:log4j-over-slf4j
artefakt,org.slf4j:log4j-over-slf4j
naśladujeslf4j:slf4j
artefakt. Dlatego wszystko, coJBoss Logging
loguje, będzie teraz przechodziło przez slf4j.Załóżmy, że używasz Logback jako zaplecza logowania. Oto próbka
pom.xml
Na swojej ścieżce klas umieść
logback.xml
taki, jak ten, który znajduje się wsrc/main/java
:Niektóre komponenty mogą chcieć mieć dostęp
logback.xml
podczas uruchamiania maszyny JVM w celu prawidłowego logowania, na przykład wtyczka Jetty Maven. W takim przypadku dodaj system Javalogback.configurationFile=./path/to/logback.xml
do polecenia (npmvn -Dlogback.configurationFile=./target/classes/logback.xml jetty:run
.).W przypadku, gdy nadal otrzymujesz "surowe" wyjście z trybu hibernacji konsoli (np.
Hibernate: select ...
), Może pojawić się pytanie o przepełnienie stosu " Wyłącz logowanie hibernacji do konsoli ".źródło
org.jboss.logging.provider=slf4j
Po pierwsze, zdajesz sobie sprawę, że SLF4J nie jest biblioteką rejestrowania, a opakowaniem dziennika. Sama niczego nie rejestruje, po prostu deleguje do „zaplecza”.
Aby "skonfigurować" jboss-logging, wystarczy dodać dowolny framework dziennika, którego chcesz używać do swojej ścieżki klas (wraz z jboss-logging), a jboss-logging wykrywa resztę.
Stworzyłem przewodnik po konfiguracji JBoss Logging skoncentrowany na Hibernacji: http://docs.jboss.org/hibernate/orm/4.3/topical/html/logging/Logging.html
źródło
org.jboss.logging.provider
właściwości systemowej.Używam Hibernate Core 4.1.7.Final plus Spring 3.1.2.RELEASE w samodzielnej aplikacji. Dodałem Log4j 1.2.17 do moich zależności i wygląda na to, że JBoss Logging loguje się bezpośrednio do log4j, jeśli jest dostępny, a Spring używa Commons Logging, który używa również Log4j, jeśli jest dostępny, wszystkie Logging można skonfigurować za pomocą Log4J.
Oto moja lista odpowiednich zależności:
źródło
więc właśnie uruchomiłem go w moim projekcie. hibernacja 4, slf4j, logowanie. mój projekt to gradle, ale powinien być taki sam dla maven.
Zasadniczo Abdull ma rację. Tam, gdzie on NIE ma racji, jest to, że NIE musisz usuwać slf4j z zależności.
uwzględnij w zakresie kompilacji:
org.slf4j: slf4j-api
org.slf4j: log4j-over-slf4j
np. do logback (ch.qos.logback: logback-classic, ch.qos.logback: logback-core: 1.0.12)
całkowicie wyklucz biblioteki log4j z zależności
wynik: logi hibernacji przez slf4j do logback. oczywiście powinieneś być w stanie użyć innej implementacji dziennika niż logback
aby upewnić się, że nie ma log4j, sprawdź swoje biblioteki w classpath lub web-inf / lib w poszukiwaniu plików wojennych.
oczywiście loggery ustawiłeś w logback.xml np:
<logger name="org.hibernate.SQL" level="TRACE"/>
źródło
Hibernate 4.3 zawiera dokumentację dotyczącą kontrolowania
org.jboss.logging
:Przeszukuje ścieżkę klasy dla dostawcy rejestrowania . Wyszukuje slf4j po wyszukaniu log4j. Zatem teoretycznie upewnienie się, że ścieżka klas (WAR) nie obejmuje log4j i zawiera API slf4j, a zaplecze powinno działać.
W ostateczności możesz ustawić
org.jboss.logging.provider
właściwość systemową naslf4j
.Pomimo roszczeń z dokumentacji,
org.jboss.logging
nalegałem na próbę użycia log4j, pomimo braku log4j i obecności SLF4J, co spowodowało następujący komunikat w moim pliku dziennika Tomcata (/var/log/tomcat/catalina.out
):Musiałem postępować zgodnie z sugestią odpowiedzi udzieloną przez dasAnderl ausMinga i dołączyć
log4j-over-slf4j
most.źródło
Używam maven i dodałem następującą zależność:
Następnie utworzyłem
log4j.properties
pliki w/src/main/resources
:Spowoduje to umieszczenie go u źródła twojego
.jar
. To działa jak urok...źródło
Miałem problem z logowaniem hibernacji 4 z weblogic 12c i log4j. Rozwiązaniem jest umieszczenie w pliku weblogic-application.xml następujących elementów:
źródło
Dla każdego, kto mógłby zmierzyć się z tym samym problemem, co ja. Jeśli wypróbowałeś wszystkie inne wyjaśnione tutaj rozwiązania i nadal nie widzisz rejestrowania hibernacji działającego z twoim slf4j, może to być spowodowane tym, że używasz kontenera, który ma w swoich bibliotekach folderów jboss-logging.jar. Oznacza to, że jest wstępnie ładowany, zanim będzie można ustawić jakąkolwiek konfigurację, aby na nią wpłynąć. Aby uniknąć tego problemu w weblogic, możesz określić w pliku weblogic-application.xml w swoim uchu / META-INF, aby preferować bibliotekę ładowaną z aplikacji. powinien istnieć podobny mechanizm dla innych kontenerów serwerów. W moim przypadku musiałem dodać:
źródło
czy próbowałeś tego:
- slf4j-log4j12.jar w przypadku Log4J. Więcej szczegółów można znaleźć w dokumentacji SLF4J. Aby użyć Log4j, musisz również umieścić plik log4j.properties w ścieżce klas. Przykładowy plik właściwości jest dystrybuowany z Hibernate w katalogu src /
po prostu dodaj te pliki jar i właściwości lub log4j xml w ścieżce klas
źródło