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 INFOnon è 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 DEBUGpriorità. Supponendo che tu abbia un log4j.propertiesposto 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;
}
INFOlevel non mostrerà alcuna attività tx, sarebbe troppo prolisso.DEBUGsarà necessario lì.