Menampilkan transaksi Musim Semi di log

102

Saya mengonfigurasi pegas dengan dukungan transaksional. Apakah ada cara untuk mencatat transaksi hanya untuk memastikan saya mengatur semuanya dengan benar? Menampilkan di log adalah cara yang baik untuk melihat apa yang terjadi.

cometta
sumber

Jawaban:

96

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 INFOtidak cukup, gunakanDEBUG

Bozho
sumber
7
INFOlevel tidak akan menampilkan aktivitas tx sama sekali, itu akan terlalu bertele-tele. DEBUGakan dibutuhkan di sana.
Skaffman
@Bozho Saya telah JpaTransactionManager dan saya ingin memantau ketika koneksi dipinjam dari pool dan ketika itu dirilis untuk transaksi tertentu.
Ali
maka Anda harus mengubah konfigurasi logging untuk kumpulan koneksi Anda
Bozho
bagaimana jika kita menggunakan mybatis + slf4j + logback + springboot?
lily
66

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]

Sander S.
sumber
1
Bagus! Tidak perlu memiliki semua info / debug / trace logging dari paket lain, saat ini yang Anda cari: D
Johanneke
31

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
MariuszS
sumber
1
Bekerja seperti pesona
Ben
9

Informasi log paling menarik dari JtaTransactionManager.java(jika pertanyaan ini masih tentang JtaTransactionManager) dicatat sebagai DEBUGprioritas. Dengan asumsi Anda memiliki suatu log4j.propertiestempat di classpath, saya menyarankan untuk menggunakan:

log4j.logger.org.springframework.transaction=DEBUG
Pascal Thivent
sumber
7

Karena Anda dapat mengakses kelas Spring saat runtime, Anda dapat menentukan status transaksi. Artikel ini dapat membantu Anda:

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

Michel Gokan
sumber
Sangat rusak, tapi coba: Tip untuk Debugging Spring's @Transactional Annotation (belum mencobanya sendiri). Ini menggunakan TransactionSynchronizationManager untuk mendapatkan status transaksi. Kode tersebut mungkin harus menggunakan variabel lokal-thread untuk menyimpan referensi ke cache isActualTransactionActive()alih - alih mengambilnya pada setiap panggilan logging.
David Tonhofer
6

Anda juga dapat mengaktifkan logging JDBC:

log4j.logger.org.springframework.jdbc=DEBUG
Semangat
sumber
1

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;
}
David Tonhofer
sumber