Jawaban:
di log4j.properties
(untuk logger alternatif, atau format xml log4j, periksa dokumen)
Bergantung pada manajer transaksi Anda, Anda dapat mengatur tingkat logging kerangka pegas sehingga memberi Anda lebih banyak info tentang transaksi. Misalnya, dalam kasus penggunaan JpaTransactionManager
, Anda mengatur
log4j.logger.org.springframework.orm.jpa=INFO
(ini adalah paket pengelola transaksi Anda), dan juga
log4j.logger.org.springframework.transaction=INFO
Jika INFO
tidak cukup, gunakanDEBUG
Bagi saya, konfigurasi logging yang bagus untuk ditambahkan adalah:
log4j.logger.org.springframework.transaction.interceptor = jejak
Ini akan menunjukkan kepada saya log seperti itu:
2012-08-22 18: 50: 00.031 TRACE - Mendapatkan transaksi untuk [com.MyClass.myMethod]
[Pernyataan log saya sendiri dari metode com.MyClass.myMethod]
2012-08-22 18: 50: 00.142 TRACE - Menyelesaikan transaksi untuk [com.MyClass.myMethod]
Untuk aplikasi Spring Boot dengan application.properties
logging.level.ROOT=INFO
logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG
atau jika Anda lebih suka Yaml ( application.yaml
)
logging:
level:
org.springframework.orm.jpa: DEBUG
org.springframework.transaction: DEBUG
Informasi log paling menarik dari JtaTransactionManager.java
(jika pertanyaan ini masih tentang JtaTransactionManager
) dicatat sebagai DEBUG
prioritas. Dengan asumsi Anda memiliki suatu log4j.properties
tempat di classpath, saya menyarankan untuk menggunakan:
log4j.logger.org.springframework.transaction=DEBUG
Karena Anda dapat mengakses kelas Spring saat runtime, Anda dapat menentukan status transaksi. Artikel ini dapat membantu Anda:
isActualTransactionActive()
alih - alih mengambilnya pada setiap panggilan logging.
Berikut adalah beberapa kode yang saya gunakan dalam implementasi Tata Letak Logback yang berasal dari ch.qos.logback.core.LayoutBase .
Saya membuat variabel thread-local untuk menyimpan referensi ke metode org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()
. Setiap kali baris log baru dicetak, getSpringTransactionInfo()
dipanggil dan mengembalikan string satu karakter yang akan masuk ke log.
Referensi:
Kode:
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 tidak akan menampilkan aktivitas tx sama sekali, itu akan terlalu bertele-tele.DEBUG
akan dibutuhkan di sana.