Just Do IT!

SpringBoot에서 Log4jdbc 사용하기 본문

개발 공부/Spring

SpringBoot에서 Log4jdbc 사용하기

MOON달 2024. 8. 12. 17:22
728x90
반응형
log4jdbc-log4j2란?
  • 자바 어플리케이션에서 JDBC 드라이버를 사용할 때 SQL문의 실행 로그를 자동으로 기록해주는 라이브러리이다.
  • MyBatis를 사용하는 경우 Query Formatting을 지원하여 실제 실행되는 쿼리에 대해 문자열로 확인이 가능하다.
    • MyBatis는 내부적으로 JDBC의 PreparedStatement를 이용해서 SQL을 처리한다.
    • 따라서 SQL에 전달되는 파라미터는 JDBC에서와 같이 '?' 로 치환되어서 처리된다.
    • SQL 로그를 제대로 보기 위해서는 이 라이브러리를 사용해야 한다.
  • 구현체인 Slf4j에서 사용이 가능하며 SQL문을 실행할 때마다 자동으로 로그를 남겨 디버깅과 모니터링을 할 수 있다.
    개발 단계에서 SQL문을 편리하게 보거나 중요한 쿼리의 수행을 보기 위해 사용한다.

 

 

 

 

 

 

Log4jdbc 적용해보기

1. build.gradle에 log4j 의존성 추가

https://mvnrepository.com/

위 링크에서 log4j를 검색해서 나오는 implements를 추가하면 된다.

 

implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'

 

2. resoures/application.properties 파일에서 datasource 수정

 

수업 들으면서 게시판 만들기 실습을 진행했는데, 위가 datasource를 수정한 예시이다.

log4jdbc를 사용하도록 driver-class-name과 url을 수정해주었다.

 

아래는 로그 설정에 대한 부연 설명이다.

  • jdbc.sqlonly
    • SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다.
  • jdbc.sqltiming
    • SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다.
  • jdbc.audit
    • ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다.
  • jdbc.resultset
    • ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다.
  • jdbc.resultsettable 
    • SQL 결과 조회된 데이터의 table을 로그로 남긴다.
  • jdbc.connection
    • 열려있는 모든 번호와 연결 수립 및 해제 이벤트를 기록. 이는 연결 문제를 찾아내는데 매우 유용 (Connection Pool 설정)

 

위의 로그 설정은 lob4jdbc 커스텀 설정 파일을 따로 만들어서 할 수도 있다.

logback.xml 파일 생성 후 xml 형식으로 로그 설정을 해줘도 된다.

그렇지만 수업에서는 간단하게 application.properties vkdlfdptj

 

3. resoures/ 내에 log4jdbc.log4j2.properties 파일 생성

 

  • log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator 
    • log4jdbc가 로그를 기록할 때 사용할 로그 delegator를 지정
    • log4jdbc의 로그 메시지가 SLF4J를 통해 출력되도록 지정
  • log4jdbc.dump.sql.maxlinelength=0
    • 로그에 출력되는 SQL 쿼리의 최대 길이를 제어한다.
    • 0으로 설정하면, SQL 쿼리가 길더라도 줄 바꿈 없이 전체 쿼리가 로그에 출력된다.
    • 즉, 쿼리의 길이에 제한을 두지 않고, 가능한 한 긴 쿼리도 한 줄로 기록된다.
  • log4jdbc.auto.load.popular.drivers=false
    • log4jdbc가 자동으로 일반적으로 사용되는 JDBC 드라이버를 로드하지 않도록 지정
    • false로 설정하면, 이러한 자동 로딩 기능이 비활성화되므로 사용자가 직접 드라이버를 지정해야 한다.
  • log4jdbc.drivers=com.mysql.cj.jdbc.Driver
    • com.mysql.cj.jdbc.Driver는 MySQL 데이터베이스에 연결하기 위한 JDBC 드라이버
    • 이 설정을 통해 log4jdbc는 MySQL 데이터베이스와 연결할 때 해당 드라이버를 사용하도록 지정

 

4. Refresh, Rebuild

 

의존성을 추가해주었기 때문에, gradle를 refresh해줘야 한다.

(이거 안해서 오류가 나서 알게 되었다...ㅋㅋ)

 

그 다음에 다시 Rebuild project하고 localhost:8080에 들어가본다면 정상적으로 연결되었음을 알 수 있다.

 

 

이렇게 sql문의 실행 결과가 나오게 된다.

각각의 sql문을 실행할 때마다 콘솔에 다르게 찍히게 나오니까 개발 과정에서 유용하게 사용할 수 있다.

 

 

 

 

 

728x90