본문 바로가기
Spring

log4jdbc2를 사용해 쿼리 로그 설정하기(mybatis 테이블 로그)

by devjh 2021. 3. 17.
반응형

이번 게시글에서는 log4jdbc를 활용한 쿼리로그 출력방법을 정리해보겠습니다.

 

(2021년 12월 가장 핫한 log4j입니다.

log4j JVM 설정법 숙지해서 보안이슈가 발생하지 않도록 주의합니다.)

 

1. pom.xml 에 의존성 추가

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

log4jdbc관련 의존성을 추가해줍니다.

 

 

 

2. application.properties 변경

#spring.datasource.driverClassName=org.h2.Driver
#spring.datasource.url=jdbc:h2:tcp://localhost/~/test

spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:h2:tcp://localhost/~/test

datasource.url와 driverClassName을 변경해줍니다.

위의 두줄을 아래 두줄로 바꿔 주었습니다.

저는 h2 DB를 사용하였지만 다른 DB도 같은방식으로 변경해주면 됩니다.

 

 

 

3. log4jdbc.log4j2.properties 생성 

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0

/src/main/resources

아래에 해당 properties파일을 생성하고 위의 내용을 입력합니다.

 

maxlinelength는 sql문을 몇줄까지 출력할지 결정합니다.

0으로 설정하면 제한없이 출력해줍니다.

해당작업 이후 sql을 실행하면 무수히 많은 로그가 쏟아집니다.

여기까지 완료가 되었다면 이제 어떤로그를 찍을지 설정해줍니다.

 

 

 

4. 로그설정하기(application.properties or logback.xml)

 

1) application.properties or logback.xml

logging.level.jdbc=off
logging.level.jdbc.sqlonly=off
logging.level.jdbc.sqltiming=info
logging.level.jdbc.resultsettable=info
logging.level.jdbc.audit=off
logging.level.jdbc.resultset=info
logging.level.jdbc.connection=off

application.properties에 해당 설정을 추가하거나

 

2) logback.xml

<configuration>
  <logger name="jdbc" level="OFF"/>
  <logger name="jdbc.sqlonly" level="OFF"/>
  <logger name="jdbc.sqltiming" level="info"/>
  <logger name="jdbc.resultsettable" level="info"/>
  <logger name="jdbc.audit" level="OFF"/>
  <logger name="jdbc.resultset" level="OFF"/>
  <logger name="jdbc.connection" level="OFF"/>
</configuration>

logback.xml에 해당 설정을 추가합니다

 

application.properties와 logback.xml에 둘다 설정을 추가하면 application.properties의 설정을 따라가는점에 유의하셔야 됩니다.

 

3) 각 패턴 정리

 

SQL관련

sqlonly와 sqltiming은 sql로그를 찍는 공통적인 기능을 하며 sqltiming이 sqlonly를 포함하고 있습니다.

#{id} 등 파라미터로 넣어준 값도 모두 치환하여 출력해줍니다.

둘다 찍도록 하면 sql문이 두번 찍히니 하나만 찍어줍니다.

 

 - jdbc.sqlonly : SQL문을 로그로 남깁니다.
 - jdbc.sqltiming : SQL문과 수행된 시간을 로그로 남깁니다.

 

TABLE관련

결과를 table형식으로 만들어 출력해줍니다.

 

jdbc.resultsettable : SQL 결과 조회된 데이터를 table 형식으로 만들어줍니다.

 

 

JDBC호출 관련

아래 두개의 설정은 일반적으로는 킬 필요가 없는 설정입니다.

두개가 묶음으로 JDBC 호출정보를 출력해주는 기능을 하며 ResultSet을 포함하느냐 포함하지 않느냐의 차이입니다.


 - jdbc.audit : ResultSet을 제외한 JDBC 호출 정보를 로그로 남긴다. 
 - jdbc.resultset : ResultSet을 포함한JDBC 호출 정보를 로그로 남깁니다.

 

 

 

5. 결과확인

 

sqltiming과 resultsettable의 레벨을 info로 설정한 결과입니다.

SQL, 수행시간, Table을 확인 할 수 있습니다.

 

SQL은 mybatis 매퍼xml 파일에 있는 형식과 동일하게 출력됩니다.

 

 

반응형

댓글