복붙노트

[SPRING] spring-mybatis로 봄 부팅 - 모든 SQL 쿼리를 로깅하는 방법

SPRING

spring-mybatis로 봄 부팅 - 모든 SQL 쿼리를 로깅하는 방법

나는 간단한 spring-boot-mybatis 앱을 가지고있다. (명심하자.) Mybatis는 실패한 경우에만 SQL 쿼리를 로깅합니다 (예외적으로). 모든 SQL 쿼리를 콘솔에 로깅하도록 강제하는 방법을 알려주십시오.

이 순간 slf4j 로거 (spring-boot에 의해 자동으로 설정)를 사용하고 있습니다. 나는이 링크를 찾는다 : http://www.mybatis.org/mybatis-3/logging.html 그러나 나는 그것을 따라갈 수 없었다. log4j에 대한 모든 구성 중 첫 번째가 표시되며 잘 모르겠다면 application.properties에서 구성하는 것으로 충분합니까?

미리 감사드립니다.

해결법

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

    1.스프링 부트는 Slf4j의 기본 로깅 공급자로 logback을 사용합니다. Ibatis 내부 로그 팩토리는 첫 번째 선택 로그 작성기로 SLF4j를로드합니다. ibatis 매퍼에 대한 로그 메시지를 게시하도록 스프링 부트 로거를 구성하기 만하면됩니다.

    스프링 부트는 Slf4j의 기본 로깅 공급자로 logback을 사용합니다. Ibatis 내부 로그 팩토리는 첫 번째 선택 로그 작성기로 SLF4j를로드합니다. ibatis 매퍼에 대한 로그 메시지를 게시하도록 스프링 부트 로거를 구성하기 만하면됩니다.

    부팅 응용 프로그램 속성에 다음 줄을 추가하십시오.

    logging.level.org.springframework=WARN
    logging.level.com.spring.ibatis.UserMapper=DEBUG
    logging.file=logs/spring-boot-logging.log
    

    두 번째 라인은 DEBUG 로그 레벨을 가진 ibatis 매퍼의 로깅 항목을 정의하는 곳입니다. com.spring.ibatis는 패키지이고 UserMapper는 샘플 매퍼입니다.

    다음 로그가 콘솔과 spring-boot-logging 파일에 나타납니다. ApplicationTest 클래스의 saveUser 및 findByName 메소드에서 생성 된 로그 메시지입니다.

    2016-12-19 22:07:06.358  INFO 7248 --- [main] com.spring.ibatis.ApplicationTest        : Started ApplicationTest in 3.048 seconds (JVM running for 4.209)
    2016-12-19 22:07:06.424 DEBUG 7248 --- [main] com.spring.ibatis.UserMapper.saveUser    : ==>  Preparing: insert into users(name) values(?) 
    2016-12-19 22:07:06.444 DEBUG 7248 --- [main] com.spring.ibatis.UserMapper.saveUser    : ==> Parameters: ibatis(String)
    2016-12-19 22:07:06.445 DEBUG 7248 --- [main] com.spring.ibatis.UserMapper.saveUser    : <==    Updates: 1
    2016-12-19 22:07:06.457 DEBUG 7248 --- [main] com.spring.ibatis.UserMapper.findByName  : ==>  Preparing: select name from users WHERE name=? 
    2016-12-19 22:07:06.470 DEBUG 7248 --- [main]  com.spring.ibatis.UserMapper.findByName  : ==> Parameters: ibatis(String)
    2016-12-19 22:07:06.504 DEBUG 7248 --- [main]  com.spring.ibatis.UserMapper.findByName  : <==      Total: 1
    

    물론 원하는 로거를 선택할 수 있습니다. 필요한 경우 다른 모든 로거에 대한 예제를 쉽게 추가 할 수 있습니다.

    Junit 테스트 케이스로 전체 코드를 https://github.com/saagar2000/ibatis

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

    2.다른 대안은 log4jdbc2와 같은 프록시 드라이버를 사용하는 것입니다.이 유틸리티는 다른 답변과 달리 매개 변수가있는 데이터베이스에 정확한 SQL을 기록하는 이점이 있습니다. 이는 지속성 제거 레이어 (예 : iBatis, JPA 등)에 관계없이 작동합니다.

    다른 대안은 log4jdbc2와 같은 프록시 드라이버를 사용하는 것입니다.이 유틸리티는 다른 답변과 달리 매개 변수가있는 데이터베이스에 정확한 SQL을 기록하는 이점이 있습니다. 이는 지속성 제거 레이어 (예 : iBatis, JPA 등)에 관계없이 작동합니다.

    https://code.google.com/archive/p/log4jdbc-log4j2/

    한 가지 주요 편의점은 SQL을 DB 프론트 엔드에 바로 복사하고 그대로 실행할 수 있다는 것입니다.

    1 Maven 종속성 추가 :

    <dependency>
        <groupId>org.bgee.log4jdbc-log4j2</groupId>
        <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
        <version>1.16</version>
    </dependency>
    

    2 로그백 구성을 추가하십시오. 관련 부분을 기존 logback.xml에 복사합니다.

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>
    
    <logger name="jdbc.audit" level="ERROR" />
    <logger name="jdbc.connection" level="ERROR" />
    <logger name="jdbc.sqltiming" level="ERROR" />
    <logger name="jdbc.resultset" level="ERROR" />
    
    <!-- UNCOMMENT THE BELOW TO HIDE THE RESULT SET TABLE OUTPUT -->
    <!--<logger name="jdbc.resultsettable" level="ERROR" /> -->
    
    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
    

    3 로깅 설정에 대해 log4jdbc2에 알려주십시오.

    Maven 프로젝트의 classpath src / test / resources 또는 src / main / resources의 루트에 log4jdbc.log4j2.properties 파일을 생성하십시오. 이 파일에는 다음과 같은 한 줄이 있습니다.

    log4jdbc.spylogdelegator.name = net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

    4 아래와 같이 DB 드라이버 클래스와 URL을 변경하십시오.

    spring.database.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
    #append log4jdbc after jdbc part of the URL: hsql example
    spring.datasource.url=jdbc:log4jdbc:hsqldb:mem:db_name 
    

    SQL 로깅 외에도 실행 된 모든 쿼리의 결과를 표 형식으로 기록합니다. 이것은 샘플 로깅 구성의 주석에 따라 비활성화 할 수 있습니다.

    샘플 출력 :

    10:44:29.400 [main] DEBUG jdbc.sqlonly -
    5. select memberrole0_.member_id as member_i2_12_0_, memberrole0_.id as id1_12_0_, memberrole0_.id 
    as id1_12_1_, memberrole0_.member_id as member_i2_12_1_, memberrole0_.role_id as role_id3_12_1_, 
    role1_.id as id1_17_2_, role1_.name as name2_17_2_ from member_roles memberrole0_ left outer 
    join roles role1_ on memberrole0_.role_id=role1_.id where memberrole0_.member_id=104 
    
    10:44:29.402 [main] INFO  jdbc.resultsettable - 
    |----------|---|---|----------|--------|---|-----|
    |member_id |id |id |member_id |role_id |id |name |
    |----------|---|---|----------|--------|---|-----|
    |----------|---|---|----------|--------|---|-----|
    
  3. ==============================

    3.https://softwareengineering.stackexchange.com/questions/108683/slf4j-vs-log4j-which-one-to-prefer

    https://softwareengineering.stackexchange.com/questions/108683/slf4j-vs-log4j-which-one-to-prefer

    따라서 slf4j 아래에 log4j를 사용하고 있다면 slf4j를 사용하는 경우 log4j 구성을 사용하는 것이 좋습니다.

    다음은 log4j 로거에서 slf4j를 사용하는 방법에 대한 설명입니다. http://saltnlight5.blogspot.ca/2013/08/how-to-configure-slf4j-with-different.html

    기본적으로 src / main / resources / log4j.properties 속성 파일을 만들고 링크의 내용과 동일하게 구성하면됩니다. 그리고 귀하의 링크가 말한대로 :

    따라서 log4j.logger.org.mybatis.example = DEBUG가 속성 파일에 설정되어 있는지 확인하십시오.

  4. from https://stackoverflow.com/questions/41001188/spring-boot-with-spring-mybatis-how-to-force-it-to-logging-all-sql-queries by cc-by-sa and MIT license