Visualizzazione di una transazione di primavera nel registro


102

Ho configurato la primavera con il supporto transazionale. C'è un modo per registrare le transazioni solo per assicurarmi di aver impostato tutto correttamente? Mostrare nel registro è un buon modo per vedere cosa sta succedendo.

Risposte:


96

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


7
INFOlevel non mostrerà alcuna attività tx, sarebbe troppo prolisso. DEBUGsarà necessario lì.
skaffman

@ Bozho Ho JpaTransactionManager e voglio monitorare quando una connessione viene presa in prestito dal pool e quando è stata rilasciata per una transazione specifica.
Ali il

quindi dovresti modificare la configurazione di registrazione per il tuo pool di connessioni
Bozho

cosa succede se usiamo mybatis + slf4j + logback + springboot?
Lily

66

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]


1
Grande! Non è necessario disporre di tutte le informazioni / debug / registrazione delle tracce di altri pacchetti, quando questo è ciò che stai cercando: D
Johanneke

31

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

1
Funziona a meraviglia
Ben

9

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

7

Poiché puoi accedere alle classi Spring in fase di esecuzione, puoi determinare lo stato della transazione. Questo articolo può aiutarti:

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


Molto rotto, ma prova: Suggerimenti per il debug dell'annotazione @Transactional di Spring (non l'ho ancora provato io stesso). Utilizza TransactionSynchronizationManager per ottenere lo stato della transazione. Il codice dovrebbe probabilmente utilizzare una variabile locale del thread per memorizzare nella cache il riferimento a isActualTransactionActive()invece di recuperarlo a ogni chiamata di registrazione.
David Tonhofer

6

Puoi anche abilitare la registrazione JDBC:

log4j.logger.org.springframework.jdbc=DEBUG

1

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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.