回答:
あなたのlog4j.properties
(代替ロガー、またはlog4jのxml形式については、ドキュメントを確認してください)
トランザクションマネージャーに応じて、Springフレームワークのロギングレベルを設定して、トランザクションに関する詳細情報を提供できます。たとえば、を使用する場合はJpaTransactionManager
、
log4j.logger.org.springframework.orm.jpa=INFO
(これはあなたのトランザクションマネージャーのパッケージです)、そしてまた
log4j.logger.org.springframework.transaction=INFO
INFO
十分でない場合は、DEBUG
私にとって、追加するのに適したロギング構成は次のとおりです。
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]のトランザクションを完了しています
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
の最も興味深いログ情報JtaTransactionManager.java
(この質問がまだに関するものである場合JtaTransactionManager
)はDEBUG
優先的にログに記録されます。あなたがlog4j.properties
クラスパスのどこかにあると仮定して、私はこのように使用することをお勧めします:
log4j.logger.org.springframework.transaction=DEBUG
実行時にSpringクラスにアクセスできるため、トランザクションのステータスを確認できます。この記事はあなたを助けるかもしれません:
isActualTransactionActive()
、ロギングの呼び出しごとに参照を取得するのではなく、スレッドローカル変数を使用して参照をキャッシュする必要があります。
これが、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;
}
INFO
levelはtxアクティビティをまったく表示しません。冗長すぎます。DEBUG
そこで必要になります。