Günlükte bir Bahar işlemi gösteriliyor


104

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:


96

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 INFOyeterli değildir, kullanımDEBUG


7
INFOseviyesi hiç tx etkinliği göstermez, çok ayrıntılı olur. DEBUGorada gerekli olacak.
skaffman

@Bozho JpaTransactionManager'ım var ve bir bağlantının havuzdan ne zaman ödünç alındığını ve belirli bir işlem için ne zaman yayınlandığını izlemek istiyorum.
Ali

daha sonra bağlantı havuzunuz için günlük kaydı yapılandırmasını değiştirmeniz gerekir
Bozho 05

mybatis + slf4j + logback + springboot kullanırsak ne olur?
lily

67

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


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

34

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

1
Tılsım gibi çalışıyor
Ben,

9

En ilginç günlük bilgileri JtaTransactionManager.java(bu soru hala hakkındaysa JtaTransactionManager) DEBUGöncelikli olarak günlüğe kaydedilir . log4j.propertiesSınıf yolunda bir yeriniz olduğunu varsayarsak , şunu kullanmanızı öneririm:

log4j.logger.org.springframework.transaction=DEBUG

7

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

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


Çok bozuk, ancak deneyin: Spring'in @Transactional Annotation'da Hata Ayıklamak İçin İpuçları (henüz kendim denemedim). İşlem durumunu almak için TransactionSynchronizationManager'ı kullanır . Kod 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 .
David Tonhofer

6

JDBC günlük kaydını da etkinleştirebilirsiniz:

log4j.logger.org.springframework.jdbc=DEBUG

1

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.