J'ai configuré Spring avec un support transactionnel. Existe-t-il un moyen de consigner les transactions simplement pour m'assurer de tout configurer correctement? Afficher dans le journal est un bon moyen de voir ce qui se passe.
dans votre log4j.properties
_ (pour les autres enregistreurs, ou le format XML de log4j, vérifiez la documentation)
En fonction de votre gestionnaire de transactions, vous pouvez définir le niveau de journalisation du framework Spring afin qu'il vous fournisse plus d'informations sur les transactions. Par exemple, si vous utilisez JpaTransactionManager
, vous définissez
log4j.logger.org.springframework.orm.jpa=INFO
(c'est le paquet de votre gestionnaire de transactions), et aussi
log4j.logger.org.springframework.transaction=INFO
Si INFO
ne suffit pas, utilisez DEBUG
Pour moi, une bonne configuration de journalisation à ajouter était:
log4j.logger.org.springframework.transaction.interceptor = trace
Il va me montrer le journal comme ça:
2012-08-22 18: 50: 00,031 TRACE - Obtention de transaction pour [com.MyClass.myMethod]
[Mes propres instructions de journal de la méthode com.MyClass.myMethod]
2012-08-22 18: 50: 00,142 TRACE - Finalisation de la transaction pour [com.MyClass.myMethod]
Pour l'application Spring Boot:
logging.level.ROOT=INFO
logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG
Informations de journal les plus intéressantes de JtaTransactionManager.Java
(si cette question concerne toujours le JtaTransactionManager
) sont enregistrés avec la priorité DEBUG
. En supposant que vous avez un log4j.properties
quelque part sur le classpath, je suggérerais donc d’utiliser:
log4j.logger.org.springframework.transaction=DEBUG
Vous pouvez également activer la journalisation JDBC:
log4j.logger.org.springframework.jdbc=DEBUG
Étant donné que vous pouvez accéder aux classes Spring au moment de l'exécution, vous pouvez déterminer le statut de la transaction. Cet article peut vous aider:
Voici du code que j'utilise dans mon implémentation Logback Layout dérivée de ch.qos.logback.core.LayoutBase .
Je crée une variable locale au thread pour stocker la référence à la méthode org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()
. Chaque fois qu'une nouvelle ligne de journal est imprimée, getSpringTransactionInfo()
est appelée et renvoie une chaîne d'un caractère qui sera insérée dans le journal.
Les références:
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;
}