Câu trả lời:
ở đị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 INFO
không đủ, hãy sử dụngDEBUG
Đố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]
Đố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
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 ở DEBUG
mức ưu tiên. Giả sử bạn có một log4j.properties
nơi nào đó trên classpath, do đó tôi khuyên bạn nên sử dụng:
log4j.logger.org.springframework.transaction=DEBUG
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:
isActualTransactionActive()
thay vì truy xuất nó trên mỗi cuộc gọi ghi nhật ký.
Đâ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;
}
INFO
cấp độ sẽ không hiển thị bất kỳ hoạt động tx nào cả, nó sẽ quá dài dòng.DEBUG
sẽ cần thiết ở đó.