web-dev-qa-db-fra.com

Affichage d'une transaction de printemps dans le journal

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.

86
cometta

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

82
Bozho

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]

59
Sander S.

Pour l'application Spring Boot:

logging.level.ROOT=INFO
logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG
20
MariuszS

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
9
Pascal Thivent

Vous pouvez également activer la journalisation JDBC:

log4j.logger.org.springframework.jdbc=DEBUG
6
Pep

É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:

https://dzone.com/articles/monitoring-declarative-transac

6
Michel Gokan

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;
}
1
David Tonhofer