2009-12-27 27 views
64

Yayları işlem desteği ile yapılandırdım. Her şeyi doğru bir şekilde kurduğumdan emin olmak için işlemleri günlüğe kaydetmenin bir yolu var mı? Günlüğü göstermek, neler olduğunu görmek için iyi bir yoldur.Kayıtta bir Yay işlemi gösteriliyor

cevap

69

, sen günlük düzeyini ayarlayabilirsiniz Bahar çerçeve böylece işlemler hakkında daha fazla bilgi verir. INFO yeterli değilse Örneğin, JpaTransactionManager kullanmanın durumda,

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

(bu işlem yöneticisinin paketidir) ve ayrıca

log4j.logger.org.springframework.transaction=INFO 

set kullanmak DEBUG

+4

'INFO' seviyesi hiç bir tx etkinliğini göstermeyecek, çok fazla verim alacaktır. 'DEBUG' orada gerekli olacaktır. – skaffman

+2

Spring3.x için çalışmaz – janwen

+0

@Bozho Ben JpaTransactionManager ve ben bir havuz havuzdan ve belirli bir işlem için serbest bırakıldığında ne zaman izlemek istiyorum. – Ali

6

Çalışma zamanında Bahar sınıflarına erişebildiğiniz için işlem durumunu belirleyebilirsiniz. Bu makale size yardımcı olabilir:

işlem yöneticisi bağlı olarak (docs kontrol alternatif kaydedici veya log4j xml biçimi) sizin log4j.properties içinde

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

+3

bozuk bağlantı .... – Gab

+0

Çok bozuk, ama deneyin: [Bahar'ın @Transactional Açıklaması] hata ayıklama ipuçları (http://blog.timmattison.com/archives/2012/04/19/tips-for-debugging-springs -transaction-annotation /) (henüz kendim denemedim). İşlem durumunu almak için [TransactionSynchronizationManager] (https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/support/TransactionSynchronizationManager.html) kullanır. Kod, her günlü aramada almak yerine, 'isActualTransactionActive()' işlevine yapılan başvuruyu önbelleğe almak için bir thread-local değişken kullanmalıdır. –

9

JtaTransactionManager.java'in en ilginç günlük bilgileri (bu soru hala JtaTransactionManager ile ilgili değilse) DEBUG öncelikli olarak günlüğe kaydedilir. Eğer üzerinde sınıf bir log4j.properties bir yere sahip varsayarsak, ben böylece kullanmayı öneririm:

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

Sen de giriş JDBC olanak verebilir: Benim için

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

oldu eklemek iyi bir günlük config :

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

Beni böyle log gösterecektir:

2012-08-22 18: 50: 00.031 İZ - yönteminden [com.MyClass.myMethod]

[kendi günlük ifadeleri için işlem alma com .MyClass.myMethod]

2012-08-22 18: 50: 00.142 TRACE - işlemin tamamlanması Yay önyükleme uygulama için [com.MyClass.myMethod]

+0

Harika! Diğer paketlerin tüm bilgi/hata ayıklama/izleme günlüğüne sahip olmanıza gerek yok, aradığınız şey bu olduğunda: D – Johanneke

4

için:

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

ch.qos.logback.core.LayoutBase'dan türetilen Logback Layout uygulamasında kullandığım bazı kodlar.

Referansı, org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive() yöntemine depolamak için iş parçacığı yerel bir değişken oluşturuyorum. Yeni bir günlük satırı yazdırıldığında, getSpringTransactionInfo() çağrılır ve günlüğe girecek tek karakterli bir dize döndürür.

Referanslar:

Kodu:

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; 
}