Zeigt eine Spring-Transaktion im Protokoll an

Lesezeit: 3 Minuten

Benutzer-Avatar
Kometta

Ich habe Spring mit Transaktionsunterstützung konfiguriert. Gibt es eine Möglichkeit, Transaktionen zu protokollieren, nur um sicherzustellen, dass ich alles richtig eingerichtet habe? Das Anzeigen im Protokoll ist eine gute Möglichkeit, um zu sehen, was passiert.

in deiner log4j.properties (Für alternative Logger oder das XML-Format von log4j, überprüfen Sie die Dokumentation)

Abhängig von Ihrem Transaktionsmanager können Sie die Protokollierungsebene des Spring-Frameworks so einstellen, dass es Ihnen mehr Informationen zu Transaktionen gibt. Zum Beispiel bei der Verwendung JpaTransactionManagerSie setzen

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

(Dies ist das Paket Ihres Transaktionsmanagers) und auch

log4j.logger.org.springframework.transaction=INFO

Ob INFO ist nicht genug, verwenden DEBUG

  • INFO level zeigt überhaupt keine tx-Aktivität, es wäre zu ausführlich. DEBUG wird dort notwendig sein.

    – Skaffmann

    27. Dezember 2009 um 11:03 Uhr

  • @Bozho Ich habe JpaTransactionManager und möchte überwachen, wann eine Verbindung aus dem Pool ausgeliehen und wann sie für eine bestimmte Transaktion freigegeben wurde.

    – Ali

    4. Juni 2013 um 18:31 Uhr

  • dann müssten Sie die Protokollierungskonfiguration für Ihren Verbindungspool ändern

    – Bozo

    5. Juni 2013 um 8:56 Uhr

  • Was ist, wenn wir mybatis+slf4j+logback+springboot verwenden?

    – Lilie

    15. Oktober 2019 um 9:23 Uhr

Benutzer-Avatar
Sander S.

Für mich war eine gute Protokollierungskonfiguration zum Hinzufügen:

log4j.logger.org.springframework.transaction.interceptor = verfolgen

Es zeigt mir das Protokoll so an:

2012-08-22 18:50:00,031 TRACE – Transaktion erhalten für [com.MyClass.myMethod]

[my own log statements from method com.MyClass.myMethod]

2012-08-22 18:50:00,142 TRACE – Abschluss der Transaktion für [com.MyClass.myMethod]

  • Toll! Sie müssen nicht alle Informationen/Debug/Trace-Protokolle anderer Pakete haben, wenn Sie danach suchen 😀

    – Johanneske

    18. Februar 2015 um 13:23 Uhr

Benutzer-Avatar
MariuszS

Für die Spring Boot-Anwendung mit application.properties

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

oder wenn Sie Yaml bevorzugen (application.yaml)

logging:
   level:
      org.springframework.orm.jpa: DEBUG
      org.springframework.transaction: DEBUG

Sie können auch die JDBC-Protokollierung aktivieren:

log4j.logger.org.springframework.jdbc=DEBUG

Die interessantesten Protokollinformationen von JtaTransactionManager.java (wenn es bei dieser Frage noch um die JtaTransactionManager) angemeldet sind DEBUG Priorität. Angenommen, Sie haben eine log4j.properties Irgendwo auf dem Klassenpfad würde ich daher vorschlagen, Folgendes zu verwenden:

log4j.logger.org.springframework.transaction=DEBUG

Benutzer-Avatar
Magnilex

Da Sie zur Laufzeit auf Spring-Klassen zugreifen können, können Sie den Transaktionsstatus bestimmen. Dieser Artikel kann Ihnen helfen:

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

Benutzer-Avatar
David Tonhofer

Hier ist ein Code, den ich in meiner Logback-Layout-Implementierung verwende, der abgeleitet ist ch.qos.logback.core.LayoutBase.

Ich erstelle eine Thread-lokale Variable, um den Verweis auf die Methode zu speichern org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive(). Immer wenn eine neue Protokollzeile ausgedruckt wird, getSpringTransactionInfo() aufgerufen und gibt eine Zeichenfolge aus einem Zeichen zurück, die in das Protokoll aufgenommen wird.

Verweise:

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;
}

1014160cookie-checkZeigt eine Spring-Transaktion im Protokoll an

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy