Hiển thị một giao dịch mùa xuân trong nhật ký


102

Tôi đã định cấu hình mùa xuân với hỗ trợ giao dịch. Có cách nào để ghi lại các giao dịch chỉ để đảm bảo tôi đã thiết lập mọi thứ một cách chính xác không? Hiển thị trong nhật ký là một cách tốt để xem những gì đang xảy ra.

Câu trả lời:


96

ở định dạng của bạn log4j.properties(đối với trình ghi thay thế hoặc định dạng xml của log4j, hãy kiểm tra tài liệu)

Tùy thuộc vào người quản lý giao dịch của bạn, bạn có thể đặt mức ghi nhật ký của khung mùa xuân để cung cấp cho bạn thêm thông tin về các giao dịch. Ví dụ, trong trường hợp sử dụng JpaTransactionManager, bạn đặt

log4j.logger.org.springframework.orm.jpa=INFO

(đây là gói của trình quản lý giao dịch của bạn) và cũng

log4j.logger.org.springframework.transaction=INFO

Nếu INFOkhông đủ, hãy sử dụngDEBUG


7
INFOcấp độ sẽ không hiển thị bất kỳ hoạt động tx nào cả, nó sẽ quá dài dòng. DEBUGsẽ cần thiết ở đó.
skaffman 27/12/09

@Bozho Tôi có JpaTransactionManager và tôi muốn theo dõi khi nào một kết nối được mượn từ pool và khi nào nó được phát hành cho một giao dịch cụ thể.
Ali

thì bạn cần phải thay đổi cấu hình ghi nhật ký cho nhóm kết nối của mình
Bozho

điều gì sẽ xảy ra nếu chúng ta sử dụng mybatis + slf4j + logback + springboot?
lily

66

Đối với tôi, một cấu hình ghi nhật ký tốt để thêm là:

log4j.logger.org.springframework.transaction.interceptor = trace

Nó sẽ hiển thị cho tôi nhật ký như thế:

2012-08-22 18: 50: 00.031 TRACE - Nhận giao dịch cho [com.MyClass.myMethod]

[báo cáo nhật ký của riêng tôi từ phương thức com.MyClass.myMethod]

2012-08-22 18: 50: 00,142 TRACE - Hoàn tất giao dịch cho [com.MyClass.myMethod]


1
Tuyệt quá! Không cần phải có tất cả các thông tin / debug / trace khai thác gỗ của các gói khác, khi điều này là những gì bạn đang tìm kiếm: D
Johanneke

31

Đối với ứng dụng Spring Boot với application.properties

logging.level.ROOT=INFO
logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG

hoặc nếu bạn thích Yaml ( application.yaml)

logging:
   level:
      org.springframework.orm.jpa: DEBUG
      org.springframework.transaction: DEBUG

1
Hoạt động như một sự quyến rũ
Ben

9

Hầu hết các thông tin nhật ký thú vị về JtaTransactionManager.java(nếu câu hỏi này vẫn là về JtaTransactionManager) được ghi ở DEBUGmức ưu tiên. Giả sử bạn có một log4j.propertiesnơi nào đó trên classpath, do đó tôi khuyên bạn nên sử dụng:

log4j.logger.org.springframework.transaction=DEBUG

7

Vì bạn có thể truy cập các lớp Spring trong thời gian chạy, bạn có thể xác định trạng thái giao dịch. Bài viết này có thể giúp bạn:

https://dzone.com/articles/monitoring-decl Compare-transac


Rất hỏng, nhưng hãy thử: Mẹo gỡ lỗi chú thích @Transactional của Spring (bản thân tôi chưa thử). Nó sử dụng TransactionSynchronizationManager để nhận trạng thái giao dịch. Mã có thể nên sử dụng một biến cục bộ luồng để lưu tham chiếu vào bộ đệm isActualTransactionActive()thay vì truy xuất nó trên mỗi cuộc gọi ghi nhật ký.
David Tonhofer

6

Bạn cũng có thể bật ghi nhật ký JDBC:

log4j.logger.org.springframework.jdbc=DEBUG

1

Đây là một số mã tôi sử dụng trong triển khai Bố cục Đăng nhập của mình bắt nguồn từ ch.qos.logback.core.LayoutBase .

Tôi tạo một biến luồng cục bộ để lưu trữ tham chiếu đến phương thức org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive(). Bất cứ khi nào một dòng nhật ký mới được in ra, getSpringTransactionInfo()nó sẽ được gọi và nó trả về một chuỗi một ký tự sẽ đi vào nhật ký.

Người giới thiệu:

Mã:

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.