Spring'i işlemsel destekle yapılandırdım. Her şeyi doğru şekilde kurduğumdan emin olmak için işlemleri kaydetmenin bir yolu var mı? Günlükte göstermek, neler olduğunu görmenin iyi bir yoludur.
Yanıtlar:
senin içinde log4j.properties
(alternatif kaydedicilerinin veya log4j xml biçimi için, dokümanlar kontrol edin)
İşlem yöneticinize bağlı olarak, size işlemler hakkında daha fazla bilgi vermesi için yay çerçevesinin günlüğe kaydetme düzeyini ayarlayabilirsiniz. Örneğin, kullanma durumunda JpaTransactionManager
, ayarladığınız
log4j.logger.org.springframework.orm.jpa=INFO
(bu, işlem yöneticinizin paketidir) ve ayrıca
log4j.logger.org.springframework.transaction=INFO
Eğer INFO
yeterli değildir, kullanımDEBUG
Benim için eklemek için iyi bir günlük yapılandırması şuydu:
log4j.logger.org.springframework.transaction.interceptor = trace
Bana şöyle bir günlük gösterecek:
2012-08-22 18: 50: 00,031 TRACE - [com.MyClass.myMethod] için işlem alınıyor
[com.MyClass.myMethod yöntemindeki kendi günlük ifadelerim]
2012-08-22 18: 50: 00,142 TRACE - [com.MyClass.myMethod] için işlem tamamlanıyor
Spring Boot uygulaması için application.properties
logging.level.ROOT=INFO
logging.level.org.springframework.orm.jpa=DEBUG
logging.level.org.springframework.transaction=DEBUG
veya Yaml'ı tercih ederseniz ( application.yaml
)
logging:
level:
org.springframework.orm.jpa: DEBUG
org.springframework.transaction: DEBUG
En ilginç günlük bilgileri JtaTransactionManager.java
(bu soru hala hakkındaysa JtaTransactionManager
) DEBUG
öncelikli olarak günlüğe kaydedilir . log4j.properties
Sınıf yolunda bir yeriniz olduğunu varsayarsak , şunu kullanmanızı öneririm:
log4j.logger.org.springframework.transaction=DEBUG
Spring sınıflarına çalışma zamanında erişebildiğiniz için işlem durumunu belirleyebilirsiniz. Bu makale size yardımcı olabilir:
isActualTransactionActive()
, her günlük çağrısında onu almak yerine referansını önbelleğe almak için muhtemelen bir iş parçacığı yerel değişkeni kullanmalıdır .
Logback Layout uygulamamda kullandığım bazı kodlar ch.qos.logback.core.LayoutBase'den türetilmiştir .
Yönteme başvuruyu depolamak için bir iş parçacığı yerel değişkeni oluşturuyorum org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive()
. Ne zaman yeni bir günlük satırı yazdırılırsa getSpringTransactionInfo()
, çağrılır ve günlüğe girecek tek karakterlik bir dize döndürür.
Referanslar:
Kod:
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
seviyesi hiç tx etkinliği göstermez, çok ayrıntılı olur.DEBUG
orada gerekli olacak.