ログにSpringトランザクションを表示する


102

Springをトランザクションサポートで構成しました。すべてを正しく設定するためにトランザクションをログに記録する方法はありますか?ログに表示することで、何が起こっているかを確認できます。

回答:


96

あなたのlog4j.properties(代替ロガー、またはlog4jのxml形式については、ドキュメントを確認してください)

トランザクションマネージャーに応じて、Springフレームワークのロギングレベルを設定して、トランザクションに関する詳細情報を提供できます。たとえば、を使用する場合はJpaTransactionManager

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

(これはあなたのトランザクションマネージャーのパッケージです)、そしてまた

log4j.logger.org.springframework.transaction=INFO

INFO十分でない場合は、DEBUG


7
INFOlevelはtxアクティビティをまったく表示しません。冗長すぎます。DEBUGそこで必要になります。
skaffman 2009

@Bozho私はJpaTransactionManagerを使用していて、接続がプールから借用されたときと、特定のトランザクションのために解放されたときを監視したいと思います。
Ali

次に、接続プールのロギング構成を変更する必要があります
Bozho

mybatis + slf4j + logback + springbootを使用するとどうなりますか?
ユリ

66

私にとって、追加するのに適したロギング構成は次のとおりです。

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

それは私にそのようなログを表示します:

2012-08-22 18:50:00,031 TRACE-[com.MyClass.myMethod]のトランザクションを取得しています

[メソッドcom.MyClass.myMethodからの自分のログステートメント]

2012-08-22 18:50:00,142 TRACE-[com.MyClass.myMethod]のトランザクションを完了しています


1
すごい!これがあなたが探しているものであるとき、他のパッケージのすべてのinfo / debug / traceログを記録する必要はありません:D
Johanneke

31

Spring Bootアプリケーションの場合 application.properties

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

または、Yamlを使用する場合(application.yaml

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

1
魅力的な作品
ベン

9

の最も興味深いログ情報JtaTransactionManager.java(この質問がまだに関するものである場合JtaTransactionManager)はDEBUG優先的にログに記録されます。あなたがlog4j.propertiesクラスパスのどこかにあると仮定して、私はこのように使用することをお勧めします:

log4j.logger.org.springframework.transaction=DEBUG

7

実行時にSpringクラスにアクセスできるため、トランザクションのステータスを確認できます。この記事はあなたを助けるかもしれません:

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


非常に壊れていますが、試してください:Springの@Transactionalアノテーションをデバッグするためのヒント(まだ試していない)。TransactionSynchronizationManagerを使用してトランザクションのステータスを取得します。このコードではisActualTransactionActive()、ロギングの呼び出しごとに参照を取得するのではなく、スレッドローカル変数を使用して参照をキャッシュする必要があります。
David Tonhofer 2017年

6

JDBCロギングを有効にすることもできます。

log4j.logger.org.springframework.jdbc=DEBUG

1

これが、ch.qos.logback.core.LayoutBaseから派生したLogback Layout実装で使用するコードです

メソッドへの参照を格納するスレッドローカル変数を作成しますorg.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()。新しいログ行が出力されるたびに、getSpringTransactionInfo()が呼び出され、ログに入る1文字の文字列を返します。

参照:

コード:

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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.