トランザクションサポートでスプリングを構成しました。すべてを正しく設定するためだけにトランザクションを記録する方法はありますか?ログに表示することは、何が起こっているのかを知る良い方法です。
あなたの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アプリケーションの場合:
logging.level.ROOT=INFO
logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG
JtaTransactionManager.Java
(この質問がまだJtaTransactionManager
に関するものである場合)の最も興味深いログ情報は、DEBUG
優先度で記録されます。クラスパスのどこかにlog4j.properties
があると仮定すると、次のように使用することをお勧めします。
log4j.logger.org.springframework.transaction=DEBUG
JDBCロギングも有効にできます。
log4j.logger.org.springframework.jdbc=DEBUG
実行時にSpringクラスにアクセスできるため、トランザクションのステータスを判断できます。この記事はあなたを助けるかもしれません:
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;
}