Risposte:
nel tuo log4j.properties
(per logger alternativi o formato xml di log4j, controlla i documenti)
A seconda del gestore delle transazioni, è possibile impostare il livello di registrazione del framework Spring in modo che fornisca maggiori informazioni sulle transazioni. Ad esempio, in caso di utilizzo JpaTransactionManager
, si imposta
log4j.logger.org.springframework.orm.jpa=INFO
(questo è il pacchetto del tuo gestore delle transazioni) e anche
log4j.logger.org.springframework.transaction=INFO
Se INFO
non è abbastanza, usaDEBUG
Per me, una buona configurazione di registrazione da aggiungere era:
log4j.logger.org.springframework.transaction.interceptor = trace
Mi mostrerà il registro in questo modo:
2012-08-22 18: 50: 00,031 TRACE - Recupero della transazione per [com.MyClass.myMethod]
[le mie istruzioni di log dal metodo com.MyClass.myMethod]
2012-08-22 18: 50: 00,142 TRACE - Completamento transazione per [com.MyClass.myMethod]
Per l'applicazione Spring Boot con application.properties
logging.level.ROOT=INFO
logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG
o se preferisci Yaml ( application.yaml
)
logging:
level:
org.springframework.orm.jpa: DEBUG
org.springframework.transaction: DEBUG
Le informazioni di registro più interessanti di JtaTransactionManager.java
(se questa domanda riguarda ancora JtaTransactionManager
) vengono registrate con DEBUG
priorità. Supponendo che tu abbia un log4j.properties
posto da qualche parte nel classpath, suggerirei quindi di usare:
log4j.logger.org.springframework.transaction=DEBUG
Poiché puoi accedere alle classi Spring in fase di esecuzione, puoi determinare lo stato della transazione. Questo articolo può aiutarti:
isActualTransactionActive()
invece di recuperarlo a ogni chiamata di registrazione.
Ecco del codice che utilizzo nella mia implementazione del layout di logback derivato da ch.qos.logback.core.LayoutBase .
Creo una variabile locale del thread per memorizzare il riferimento al metodo org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()
. Ogni volta che viene stampata una nuova riga di registro, getSpringTransactionInfo()
viene chiamata e restituisce una stringa di un carattere che andrà nel registro.
Riferimenti:
Codice:
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 non mostrerà alcuna attività tx, sarebbe troppo prolisso.DEBUG
sarà necessario lì.