Pokazanie wiosennej transakcji w dzienniku

Skonfigurowałem spring z obsługą transakcyjną. Czy jest jakiś sposób, aby rejestrować transakcje tylko po to, aby upewnić się, że wszystko skonfigurowałem poprawnie? Pokazywanie w dzienniku jest dobrym sposobem, aby zobaczyć, co się dzieje.

Author: praseodym, 2009-12-27

7 answers

W twoim log4j.properties (w przypadku alternatywnych loggerów lub w formacie XML log4j sprawdź dokumenty)

W zależności od menedżera transakcji, możesz ustawić poziom logowania w ramach spring framework, aby dawał ci więcej informacji o transakcjach. Na przykład, w przypadku użycia JpaTransactionManager, ustawiasz

log4j.logger.org.springframework.orm.jpa=INFO

(jest to pakiet twojego menedżera transakcji), a także

log4j.logger.org.springframework.transaction=INFO

Jeśli INFO to za mało, użyj DEBUG

 76
Author: Bozho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-27 09:23:15

Dla mnie dobrym konfiguratorem logowania do dodania było:

Log4j.logger.org. springframework.transaction. interceptor = trace

Wyświetli mi się taki log:

2012-08-22 18:50:00,031 transakcja Trace-Getting dla [Kom.MyClass.myMethod]

[moje własne logowania z method com.MyClass.myMethod]

2012-08-22 18:50:00,142 TRACE-Completing transaction for [com.MyClass.myMethod]

 51
Author: Sander S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-22 15:58:37

Najciekawsze informacje z dziennika JtaTransactionManager.java (jeśli to pytanie nadal dotyczy JtaTransactionManager) są rejestrowane w priorytecie DEBUG. Zakładając, że masz log4j.properties gdzieś na classpath, sugerowałbym użycie:

log4j.logger.org.springframework.transaction=DEBUG
 9
Author: Pascal Thivent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-27 11:26:51

Do aplikacji Spring Boot:

logging.level.ROOT=INFO
logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG
 8
Author: MariuszS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-20 20:09:48

Ponieważ możesz uzyskać dostęp do klas Spring w czasie wykonywania, możesz określić status transakcji. Ten artykuł może Ci pomóc:

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

 6
Author: Michel Gokan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-13 06:46:58

Możesz również włączyć logowanie JDBC:

log4j.logger.org.springframework.jdbc=DEBUG
 4
Author: Pep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-11 23:24:39

Oto kod, którego używam w mojej implementacji układu Logback wywodzącej się z ch.qos.logback.rdzeń.LayoutBase .

Tworzę zmienną thread-local do przechowywania referencji do metody org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive(). Za każdym razem, gdy wypisywana jest nowa linia dziennika, wywoływana jest getSpringTransactionInfo(), która zwraca jednoznakowy ciąg znaków, który trafi do dziennika.

Bibliografia:

Kod:

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
Author: David Tonhofer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-10 08:53:09