120

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

4

7 に答える 7

109

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

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

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

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

log4j.logger.org.springframework.transaction=INFO

INFO十分でない場合は、DEBUG

于 2009-12-27T09:23:15.983 に答える
76

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

log4j.logger.org.springframework.transaction.interceptor=トレース

次のようなログが表示されます。

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

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

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

于 2012-08-22T15:58:37.803 に答える
56

SpringBootアプリケーションの場合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
于 2017-07-20T20:09:48.023 に答える
9

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

log4j.logger.org.springframework.jdbc=DEBUG
于 2012-03-11T23:24:39.040 に答える
9

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

log4j.logger.org.springframework.transaction=DEBUG
于 2009-12-27T11:26:51.987 に答える
6

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

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

于 2009-12-27T08:21:00.663 に答える
3

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

メソッドへの参照を格納するスレッドローカル変数を作成します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;
}
于 2017-10-10T08:53:09.867 に答える