Antworten:
in Ihrem log4j.properties
(für alternative Logger oder das XML-Format von log4j überprüfen Sie die Dokumente)
Abhängig von Ihrem Transaktionsmanager können Sie die Protokollierungsstufe des Spring Frameworks so einstellen, dass Sie weitere Informationen zu Transaktionen erhalten. Zum Beispiel, wenn Sie verwenden JpaTransactionManager
, setzen Sie
log4j.logger.org.springframework.orm.jpa=INFO
(Dies ist das Paket Ihres Transaktionsmanagers) und auch
log4j.logger.org.springframework.transaction=INFO
Wenn INFO
nicht genug, verwenden SieDEBUG
Für mich war eine gute Protokollierungskonfiguration zum Hinzufügen:
log4j.logger.org.springframework.transaction.interceptor = trace
Es wird mir folgendes Protokoll zeigen:
2012-08-22 18: 50: 00,031 TRACE - Transaktion für [com.MyClass.myMethod] abrufen
[meine eigenen Protokollanweisungen von der Methode com.MyClass.myMethod]
2012-08-22 18: 50: 00,142 TRACE - Abschluss der Transaktion für [com.MyClass.myMethod]
Für Spring Boot-Anwendung mit application.properties
logging.level.ROOT=INFO
logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG
oder wenn Sie Yaml bevorzugen ( application.yaml
)
logging:
level:
org.springframework.orm.jpa: DEBUG
org.springframework.transaction: DEBUG
Die interessantesten Protokollinformationen von JtaTransactionManager.java
(wenn es sich bei dieser Frage noch um das handelt JtaTransactionManager
) werden DEBUG
vorrangig protokolliert . Angenommen, Sie haben log4j.properties
irgendwo auf dem Klassenpfad, würde ich daher empfehlen, Folgendes zu verwenden:
log4j.logger.org.springframework.transaction=DEBUG
Da Sie zur Laufzeit auf Spring-Klassen zugreifen können, können Sie den Transaktionsstatus bestimmen. Dieser Artikel kann Ihnen helfen:
isActualTransactionActive()
anstatt ihn bei jedem Protokollierungsaufruf abzurufen.
Hier ist ein Code, den ich in meiner Logback-Layout-Implementierung verwende, die von ch.qos.logback.core.LayoutBase abgeleitet ist .
Ich erstelle eine threadlokale Variable, um den Verweis auf die Methode zu speichern org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()
. Immer wenn eine neue Protokollzeile ausgedruckt wird, getSpringTransactionInfo()
wird sie aufgerufen und es wird eine einstellige Zeichenfolge zurückgegeben, die in das Protokoll aufgenommen wird.
Verweise:
Code:
private static ThreadLocal<Method> txCheckMethod;
private static String getSpringTransactionInfo() {
if (txCheckMethod == null) {
txCheckMethod = new ThreadLocal<Method>() {
@Override public Method initialValue() {
try {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
Class<?> tsmClass = contextClassLoader.loadClass("org.springframework.transaction.support.TransactionSynchronizationManager");
return tsmClass.getMethod("isActualTransactionActive", (Class<?>[])null);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
};
}
assert txCheckMethod != null;
Method m = txCheckMethod.get();
String res;
if (m == null) {
res = " "; // there is no Spring here
}
else {
Boolean isActive = null;
try {
isActive = (Boolean) m.invoke((Object)null);
if (isActive) {
res = "T"; // transaction active
}
else {
res = "~"; // transaction inactive
}
}
catch (Exception exe) {
// suppress
res = "?";
}
}
return res;
}
INFO
level zeigt überhaupt keine tx-Aktivität an, es wäre zu ausführlich.DEBUG
wird dort notwendig sein.