web-dev-qa-db-ja.com

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

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

86
cometta

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

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

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

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

log4j.logger.org.springframework.transaction=INFO

INFOで十分でない場合は、DEBUGを使用します

82
Bozho

私にとって、追加するのに適したログ設定は次のとおりです。

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]のトランザクションを完了しています

59
Sander S.

Spring Bootアプリケーションの場合:

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

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

log4j.logger.org.springframework.transaction=DEBUG
9
Pascal Thivent

JDBCロギングも有効にできます。

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

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

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

6
Michel Gokan

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