2009-12-27 47 views
64

Tôi đã định cấu hình lò xo có 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ứ chính xác không? Hiển thị trong nhật ký là một cách hay để xem điều gì đang xảy ra.Hiển thị giao dịch Mùa xuân trong nhật ký

Trả lời

69

trong bạn log4j.properties (đối với khai thác gỗ thay thế, hoặc định dạng xml log4j của, kiểm tra các tài liệu)

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

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

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

log4j.logger.org.springframework.transaction=INFO 

Nếu INFO là không đủ, sử dụng DEBUG

+4

Cấp độ 'INFO' sẽ không hiển thị bất kỳ hoạt động tx nào, nó sẽ quá dài dòng. 'DEBUG' sẽ cần thiết ở đó. – skaffman

+2

Không hoạt động cho spring3.x – janwen

+0

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

6

Vì bạn có thể truy cập vào các lớp Spring khi 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-declarative-transac

+3

liên kết bị hỏng .... – Gab

+0

Rất bị hỏng, nhưng hãy thử: [Mẹo để gỡ lỗi chú thích @Transactional của mùa xuân] (http://blog.timmattison.com/archives/2012/04/19/tips-for-debugging-springs -transactional-annotation /) (chưa thử bản thân mình). Nó sử dụng [TransactionSynchronizationManager] (https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationManager.html) để nhận trạng thái giao dịch. Mã này có lẽ nên sử dụng biến thread-local để lưu trữ tham chiếu đến 'isActualTransactionActive()' thay vì truy xuất nó trên mỗi cuộc gọi ghi nhật ký. –

9

Thông tin nhật ký thú vị nhất của JtaTransactionManager.java (nếu câu hỏi này vẫn còn về số JtaTransactionManager) được ghi lại ở mức ưu tiên DEBUG. Giả sử bạn có một nơi log4j.properties trên classpath, tôi muốn đề nghị như vậy, để sử dụng:

log4j.logger.org.springframework.transaction=DEBUG 
4

Bạn có thể kích hoạt tính năng đăng nhập JDBC cũng như:

log4j.logger.org.springframework.jdbc=DEBUG 
44

Đối với tôi, một cấu hình khai thác gỗ tốt để thêm là :

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

Nó sẽ chỉ cho tôi đăng nhập như thế:

2012-08-22 18: 50: 00.031 TRACE - Bắt giao dịch cho [com.MyClass.myMethod]

[báo cáo log của riêng tôi từ phương pháp com .MyClass.myMethod]

2012-08-22 18: 50: 00.142 TRACE - Hoàn thành giao dịch cho [com.MyClass.myMethod]

+0

Tuyệt vời! Không cần phải có tất cả các thông tin/gỡ lỗi/theo dõi đăng nhập của các gói khác, khi đây là những gì bạn đang tìm kiếm: D – Johanneke

4

đối với mùa xuân Boot ứng dụng:

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

Dưới đây là một số mã tôi sử dụng trong triển khai Bố cục nhật ký của mình có nguồn gốc từ ch.qos.logback.core.LayoutBase.

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

Tài liệu tham khảo:

Code:

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; 
} 
Các vấn đề liên quan