본문 바로가기

프로그래밍/Spring

[Spring] (SpringBoot) SQL 로그 남기기

 프로젝트를 진행하며, 예상치 않게 오류가 발생하거나 원하지 않은 데이터가 뿌려진 경험이 있다. 이럴 때 마다 문득 내가 작성한 SQL문에 문제가 있는지 로그로 찍어 보고싶어서 log4j2를 이용하여 SQL문과 데이터를 출력하는 작업을 추가하였다.

1. pom.xml에 log4j2 dependency 추가

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

 

2. 기존 application.properties 내용 수정

기존 DB 소스코드
#spring.datasource.url: jdbc:mysql://localhost/covid
#spring.datasource.username: root
#spring.datasource.password: 1234
#spring.datasource.driver-class-name:com.mysql.cj.jdbc.Driver

변경 DB 소스코드
spring.datasource.url: jdbc:log4jdbc:mysql://localhost/covid
spring.datasource.username: root
spring.datasource.password: 1234
spring.datasource.driver-class-name:net.sf.log4jdbc.sql.jdbcapi.DriverSpy

 

3. log4jdbc.log4j2.properties 생성

src/main/resources 아래 log4jdbc.log4j2.properties 파일을 이름 그대로 생성하여 추가한다.

* properties 파일 생성 방법

프로젝트 우클릭 -> new -> other -> Untitled Text File -> Finish -> 좌측 상단 File -> Save As -> 파일을 저장할 위치 지정 및 파일명 log4jdbc.log4j2.properties으로 변경

 

log4jdbc.log4j2.properties 파일을 추가 한 뒤 아래 소스 코드 작성

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

 여기까지만 해도 서버 구동 후 쿼리 수행하는 기능을 작동해 보면 이전과는 다른, 매우 디테일한 수많은 로그들이 올라올 것이다. 별다른 셋팅을 해 주지 않으면, 기본적으로 log4jdbc가 제공하는 모든 로깅 옵션들이 다 켜진 상태로 로그를 출력한다.

 하지만 더 보기 좋은 모습으로 로그를 출력하기 위해 아래 4번 작업을 추가해주자.

 

 

4. logback.xml 파일 생성

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

    <encoder>

      <pattern>%d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-3level %logger{5} - %msg %n</pattern>

    </encoder>

  </appender>

  <logger name="jdbc" level="OFF"/>

  <logger name="jdbc.sqlonly" level="OFF"/>

  <logger name="jdbc.sqltiming" level="DEBUG"/>

  <logger name="jdbc.audit" level="OFF"/>

  <logger name="jdbc.resultset" level="OFF"/>

  <logger name="jdbc.resultsettable" level="DEBUG"/>

  <logger name="jdbc.connection" level="OFF"/>

  <root level="INFO">

    <appender-ref ref="STDOUT" />

  </root>
  
</configuration>

마찬가지로 src/main/resources 경로에 logback.xml파일을 생성하여 위 소스코드를 작성해준다. 

 - jdbc.sqlonly : SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다.

 - jdbc.sqltiming : SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다. 

 - jdbc.audit : ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다.

- jdbc.resultset : ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다. 

- jdbc.resultsettable : SQL 결과 조회된 데이터의 table을 로그로 남긴다.

 

5. 결과 예시