복붙노트

[SPRING] 로그에 Spring 트랜잭션 표시하기

SPRING

로그에 Spring 트랜잭션 표시하기

나는 트랜잭션 지원으로 봄을 구성했다. 모든 것을 올바르게 설정하도록 트랜잭션을 기록하는 방법이 있습니까? 로그에 표시하면 무슨 일이 일어나고 있는지 알 수있는 좋은 방법입니다.

해결법

  1. ==============================

    1.log4j.properties (대체 로거 또는 log4j의 xml 형식의 경우 문서 확인)

    log4j.properties (대체 로거 또는 log4j의 xml 형식의 경우 문서 확인)

    트랜잭션 관리자에 따라 스프링 프레임 워크의 로깅 수준을 설정하여 트랜잭션에 대한 자세한 정보를 제공 할 수 있습니다. 예를 들어, JpaTransactionManager를 사용하는 경우,

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

    (이것은 거래 관리자의 패키지입니다), 또한

    log4j.logger.org.springframework.transaction=INFO
    

    INFO가 충분하지 않으면 DEBUG을 사용하십시오.

  2. ==============================

    2.나를 위해 추가 할 좋은 로깅 설정은 다음과 같습니다.

    나를 위해 추가 할 좋은 로깅 설정은 다음과 같습니다.

    다음과 같은 로그가 표시됩니다.

  3. ==============================

    3.스프링 부트 응용 프로그램 :

    스프링 부트 응용 프로그램 :

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

    4.JtaTransactionManager.java의 가장 흥미로운 로그 정보 (이 질문이 아직 JtaTransactionManager와 관련된 경우)는 DEBUG 우선 순위로 기록됩니다. 클래스 패스 어딘가에 log4j.properties가 있다고 가정하면 다음과 같이 사용할 것을 제안합니다.

    JtaTransactionManager.java의 가장 흥미로운 로그 정보 (이 질문이 아직 JtaTransactionManager와 관련된 경우)는 DEBUG 우선 순위로 기록됩니다. 클래스 패스 어딘가에 log4j.properties가 있다고 가정하면 다음과 같이 사용할 것을 제안합니다.

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

    5.런타임에 Spring 클래스에 액세스 할 수 있으므로 트랜잭션 상태를 결정할 수 있습니다. 이 기사가 도움이 될 것입니다.

    런타임에 Spring 클래스에 액세스 할 수 있으므로 트랜잭션 상태를 결정할 수 있습니다. 이 기사가 도움이 될 것입니다.

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

  6. ==============================

    6.JDBC 로깅을 활성화 할 수도 있습니다.

    JDBC 로깅을 활성화 할 수도 있습니다.

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

    7.다음은 ch.qos.logback.core.LayoutBase에서 파생 된 Logback Layout 구현에서 사용하는 일부 코드입니다.

    다음은 ch.qos.logback.core.LayoutBase에서 파생 된 Logback Layout 구현에서 사용하는 일부 코드입니다.

    나는 스레드 로컬 변수를 생성하여 org.springframework.transaction.support.TransactionSynchronizationManager.isActualTransactionActive () 메소드에 대한 참조를 저장한다. 새로운 로그 라인이 인쇄 될 때마다 getSpringTransactionInfo ()가 호출되고 로그에 들어갈 한 자의 문자열을 반환합니다.

    참고 문헌 :

    암호:

    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;
    }
    
  8. from https://stackoverflow.com/questions/1965454/showing-a-spring-transaction-in-log by cc-by-sa and MIT license