Ruhezustand 3.x verwendet slf4jzur Protokollierung. Hibernate 4.x verwendetjboss-logging. Ich schreibe eine eigenständige Anwendung, die Hibernate 4 und SLF4J für die Protokollierung verwendet.
Wie kann ich den Ruhezustand so konfigurieren, dass er sich bei SLF4J anmeldet?
Wenn dies nicht möglich ist, wie kann ich die Protokollierung von Hibernate überhaupt konfigurieren?
Der manuelle Abschnitt zu Hibernate 4.1 zur Protokollierung beginnt mit der Warnung, dass ...
Völlig veraltet. Hibernate verwendet JBoss Logging ab 4.0. Dies wird dokumentiert, wenn wir diesen Inhalt in das Entwicklerhandbuch migrieren.
... spricht weiter über SLF4J und ist daher nutzlos. Weder in der Anleitung für die ersten Schritte noch in der Anleitung für Entwickler wird überhaupt über die Protokollierung gesprochen. Der Migrationsleitfaden auch nicht .
Ich habe nach Dokumentation zur JBoss-Protokollierung selbst gesucht, aber ich konnte überhaupt keine finden. Die GitHub-Seite ist still und auf der Community- Projektseite von JBoss wird nicht einmal die JBoss-Protokollierung aufgeführt. Ich habe mich gefragt, ob der Bug-Tracker des Projekts möglicherweise Probleme mit der Bereitstellung von Dokumentation hat, aber das tut er nicht.
Die gute Nachricht ist, dass bei Verwendung von Hibernate 4 in einem Anwendungsserver wie JBoss AS7 die Protokollierung weitgehend für Sie erledigt wird. Aber wie kann ich es in einer eigenständigen Anwendung konfigurieren?
quelle
Antworten:
Schauen Sie unter https://github.com/jboss-logging/jboss-logging/blob/master/src/main/java/org/jboss/logging/LoggerProviders.java nach :
So mögliche Werte
org.jboss.logging.provider
sind:jboss
,jdk
,log4j
,slf4j
.Wenn Sie es nicht festlegen
org.jboss.logging.provider
, versuchen Sie es mit jboss, dann mit log4j, dann mit slf4j (nur wenn logback verwendet wird) und mit jdk.Ich benutze
slf4j
mitlogback-classic
:und alle funktionieren gut!
UPDATE Einige Benutzer verwenden in sehr Haupt-App.java:
Bei containergestützten Lösungen funktioniert dies jedoch nicht.
UPDATE 2 Wer glaubt, Log4j mit SLF4J dafür zu verwalten
jboss-logging
, ist nicht genau so.jboss-logging
verwendet direkt Log4j ohne SLF4J!quelle
org.jboss.logging.provider
?System.getProperty(LOGGING_PROVIDER_KEY);
Sie die Systemeigenschaft festlegen. Durchsuchenjava -D...=...
oder überprüfen Sie die Dokumente für Ihren Container.Damit SLF4J mit JBoss Logging ohne Logback als Backend funktioniert, muss eine Systemeigenschaft verwendet werden
org.jboss.logging.provider=slf4j
.log4j-over-slf4j
Die Taktik scheint in diesem Fall nicht zu funktionieren, da die Protokollierung auf JDK zurückgreift, wenn weder Logback noch log4j tatsächlich im Klassenpfad vorhanden sind.Dies ist ein bisschen lästig und um die automatische Erkennung zum Laufen zu bringen, haben Sie gesehen, dass der Klassenlader mindestens
ch.qos.logback.classic.Logger
von logback-classic oder enthältorg.apache.log4j.Hierarchy
log4j enthält, um die JBoss-Protokollierung davon abzuhalten, nicht auf die JDK-Protokollierung zurückzugreifen.Die Magie wird bei interpretiert
org.jboss.logging.LoggerProviders
UPDATE: Die Unterstützung für Service Loader wurde hinzugefügt, damit Probleme mit der automatischen Erkennung durch Deklarieren
META-INF/services/org.jboss.logging.LoggerProvider
(mitorg.jboss.logging.Slf4jLoggerProvider
als Wert) vermieden werden können . Es scheint auch Unterstützung für log4j2 hinzugefügt zu haben.quelle
-Dorg.jboss.logging.provider=slf4j
aus. Mit LoggingProviders.java erhalten Sie bessere Einblicke in die aktuell akzeptierten Werte und in das, was im Klassenpfad zu erwarten ist.Slf4jLoggerProvider
keinepublic
Klasse ist.Inspiriert von Leifs Hypoport-Post , habe ich Hibernate 4 auf diese Weise zurück zu slf4j "gebogen":
Nehmen wir an, Sie verwenden Maven.
org.slf4j:log4j-over-slf4j
als Abhängigkeit zu Ihrem hinzupom.xml
mvn dependency:tree
sicher, dass keines der Artefakte, von denen Sie abhängig sind, abhängig istslf4j:slf4j
(um genau zu sein, darf kein Artefakt eine Abhängigkeit vom Kompilierungsbereich oder vom Laufzeitbereich habenslf4j:slf4j
).Hintergrund: Hibernate 4.x ist vom Artefakt abhängig
org.jboss.logging:jboss-logging
. Transitiv hat dieses Artefakt eine bereitgestellte Bereichsabhängigkeit von dem Artefaktslf4j:slf4j
.Da wir jetzt das
org.slf4j:log4j-over-slf4j
Artefakt hinzugefügt haben ,org.slf4j:log4j-over-slf4j
ahmt es dasslf4j:slf4j
Artefakt nach. Deshalb alles dasJBoss Logging
wird jetzt protokolliert wird, tatsächlich über slf4j übertragen.Angenommen , Sie verwenden Logback als Protokollierungs-Backend. Hier ist ein Beispiel
pom.xml
Haben Sie auf Ihrem Klassenpfad eine
logback.xml
, wie diese insrc/main/java
:Einige Komponenten
logback.xml
, z. B. das Jetty Maven Plugin, möchten möglicherweise beim Start von JVM Zugriff auf die ordnungsgemäße Protokollierung haben. Fügen Sie in diesem Falllogback.configurationFile=./path/to/logback.xml
Ihrem Befehl ein Java-System hinzu (zmvn -Dlogback.configurationFile=./target/classes/logback.xml jetty:run
. B. ).Wenn Sie immer noch eine "rohe" Konsolen-Standardausgabe im Ruhezustand (wie
Hibernate: select ...
) erhalten, kann die Stapelüberlauf-Frage " Deaktivieren der Ruhezustandsprotokollierung an der Konsole " zutreffen.quelle
org.jboss.logging.provider=slf4j
Zuerst stellen Sie fest, dass SLF4J keine Protokollierungsbibliothek ist, sondern ein Protokollierungs-Wrapper. Es selbst protokolliert nichts, es delegiert einfach an "Backends".
Um die jboss-Protokollierung zu "konfigurieren", fügen Sie einfach das Protokollframework hinzu, das Sie in Ihrem Klassenpfad verwenden möchten (zusammen mit der jboss-Protokollierung), und die jboss-Protokollierung ermittelt den Rest.
Ich habe eine auf den Ruhezustand ausgerichtete Anleitung zur JBoss-Protokollierungskonfiguration erstellt: http://docs.jboss.org/hibernate/orm/4.3/topical/html/logging/Logging.html
quelle
org.jboss.logging.provider
Systemeigenschaft überschrieben werden.Ich verwende Hibernate Core 4.1.7.Final plus Spring 3.1.2.RELEASE in einer eigenständigen App. Ich habe Log4j 1.2.17 zu meinen Abhängigkeiten hinzugefügt, und es scheint, dass JBoss Logging direkt in log4j protokolliert, sofern verfügbar, und Spring Commons Logging verwendet. Wenn verfügbar, wird auch Log4j verwendet. Die gesamte Protokollierung kann über Log4J konfiguriert werden.
Hier ist meine Liste der relevanten Abhängigkeiten:
quelle
Also, ich habe es gerade in meinem Projekt zum Laufen gebracht. Ruhezustand 4, slf4j, Logback. mein projekt ist gradle, sollte aber für maven gleich sein.
Grundsätzlich hat Abdull recht. Wo er NICHT Recht hat, ist, dass Sie slf4j NICHT aus Abhängigkeiten entfernen müssen.
include zum Kompilieren des Gültigkeitsbereichs:
org.slf4j: slf4j-api
org.slf4j: log4j-over-slf4j
zB für Logback (ch.qos.logback: logback-classic, ch.qos.logback: logback-core: 1.0.12)
log4j libs vollständig von Abhängigkeiten ausschließen
Ergebnis: Protokolle im Ruhezustand über slf4j zum Zurückmelden. Natürlich sollten Sie in der Lage sein, eine andere Protokollimplementierung als Logback zu verwenden
Um sicherzustellen, dass kein log4j vorhanden ist, überprüfen Sie Ihre Bibliotheken auf classpath oder web-inf / lib auf Kriegsdateien.
Natürlich haben Sie die Logger in logback.xml gesetzt, zB:
<logger name="org.hibernate.SQL" level="TRACE"/>
quelle
In Hibernate 4.3 finden Sie einige Dokumentationen zur Steuerung
org.jboss.logging
:Es durchsucht den Klassenpfad nach einem Protokollierungsanbieter . Nach der Suche nach log4j wird nach slf4j gesucht. Theoretisch sollte also funktionieren, um sicherzustellen, dass Ihr Klassenpfad (WAR) nicht log4j und die slf4j-API enthält und ein Back-End funktionieren sollte.
Als letzten Ausweg können Sie die
org.jboss.logging.provider
Systemeigenschaft auf festlegenslf4j
.Trotz der Behauptungen der Dokumentation
org.jboss.logging
bestand ich darauf, log4j zu verwenden, obwohl log4j nicht vorhanden war und SLF4J vorhanden war, was zu der folgenden Meldung in meiner Tomcat-Protokolldatei (/var/log/tomcat/catalina.out
) führte:Ich musste dem Vorschlag der Antwort von dasAnderl ausMinga folgen und die
log4j-over-slf4j
Brücke einschließen .quelle
Ich benutze Maven und habe die folgende Abhängigkeit hinzugefügt:
Dann habe ich eine
log4j.properties
Datei erstellt in/src/main/resources
:Dies wird es an die Wurzel Ihres
.jar
. Es wirkt wie ein Zauber...quelle
Ich hatte ein Problem damit, dass die Protokollierung im Ruhezustand 4 mit Weblogic 12c und log4j funktioniert. Die Lösung besteht darin, Folgendes in Ihre weblogic-application.xml aufzunehmen:
quelle
Für jeden, der das gleiche Problem haben könnte, das ich hatte. Falls Sie alle anderen hier erläuterten Lösungen ausprobiert haben und immer noch keine Protokollierung im Ruhezustand mit Ihrem slf4j sehen, kann dies daran liegen, dass Sie einen Container verwenden, der in seinen Ordnerbibliotheken die Datei jboss-logging.jar enthält. Dies bedeutet, dass es vorinstalliert wird, bevor Sie überhaupt eine Konfiguration festlegen können, um sie zu beeinflussen. Um dieses Problem in Weblogic zu vermeiden, können Sie in der Datei weblogic-application.xml in Ihrem Ohr / META-INF angeben, dass die aus der Anwendung geladene Bibliothek bevorzugt wird. Es sollte einen ähnlichen Mechanismus für andere Servercontainer geben. In meinem Fall musste ich hinzufügen:
quelle
Hast du das versucht:
- slf4j-log4j12.jar im Fall von Log4J. Weitere Informationen finden Sie in der SLF4J-Dokumentation. Um Log4j verwenden zu können, müssen Sie außerdem eine Datei log4j.properties in Ihren Klassenpfad einfügen. Eine Beispiel-Eigenschaftendatei wird mit Hibernate im Verzeichnis src / verteilt
Fügen Sie einfach diese Jars und Eigenschaften oder log4j xml in den Klassenpfad ein
quelle