トランザクションサポートを使用してSpringを構成しました。すべてが正しく設定されていることを確認するためだけにトランザクションをログに記録する方法はありますか?ログに表示することは、何が起こっているかを確認するための良い方法です。
7 に答える
(log4j.properties
代替ロガー、またはlog4jのxml形式については、ドキュメントを確認してください)
トランザクションマネージャーによっては、Spring Frameworkのログレベルを設定して、トランザクションに関する詳細情報を提供することができます。たとえば、を使用する場合はJpaTransactionManager
、
log4j.logger.org.springframework.orm.jpa=INFO
(これはトランザクションマネージャーのパッケージです)、および
log4j.logger.org.springframework.transaction=INFO
INFO
十分でない場合は、DEBUG
私にとって、追加するのに適したロギング構成は次のとおりです。
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]のトランザクションを完了します
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
JDBCロギングを有効にすることもできます。
log4j.logger.org.springframework.jdbc=DEBUG
の最も興味深いログ情報JtaTransactionManager.java
(この質問がまだについてである場合JtaTransactionManager
)がDEBUG
優先的にログに記録されます。クラスパスのどこかにあると仮定するとlog4j.properties
、次のように使用することをお勧めします。
log4j.logger.org.springframework.transaction=DEBUG
実行時にSpringクラスにアクセスできるため、トランザクションのステータスを確認できます。この記事はあなたを助けるかもしれません:
これは、ch.qos.logback.core.LayoutBaseから派生したLogbackLayout実装で使用するコードです。
メソッドへの参照を格納するスレッドローカル変数を作成しますorg.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()
。新しいログ行が出力されるたびに、getSpringTransactionInfo()
が呼び出され、ログに記録される1文字の文字列が返されます。
参照:
- Springの@Transactionalアノテーションをデバッグするためのヒント
- org.springframework.transaction.support.TransactionSynchronizationManager
- java.lang.ThreadLocal
- java.lang.Class.getMethod()
コード:
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;
}