졸업 프로젝트를 할 때는 우당탕탕 하느라 프로젝트에 대해서 잘 몰랐는데
이번에 하나하나 보면서 하는데 Logback을 사용하여 쿼리 로그를 볼 수 있다는 것을 알았다.
Logback은 Log4j를 기반으로 작성된 로그 라이브러리다. Logback을 사용한 로그 설정 변경의 경우, 서버를 따로 재시작하지 않아도 반영된다는 장점을 가지고 있다. Logback은 로깅 구현제 중 하나로 slf4j(Simple Logging Facade for Java)를 함께 사용한다. slf4j의 API를 이용할 경우 실제 로깅을 담당하는 로깅 구현체의 종류와 상관없이 일관된 로그 코드를 작성 할 수 있다.
src/main/resources 폴더 밑에 logback-spring.xml 파일을 생성한다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- Appenders -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%d %5p [%c] %m%n</Pattern>
</encoder>
</appender>
<appender name="console-infolog" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%d %5p %m%n</Pattern>
</encoder>
</appender>
<!-- 로거 -->
<logger name="board" level="DEBUG" appender-ref="console"/>
<!-- 루트 로거 -->
<root level="off">
<appender-ref ref="console"/>
</root>
</configuration>
| 태그 | 설명 |
|---|---|
| appender | 로그를 어디에 출력할지 결정하는 역할을 함.(콘솔, 파일기록, DB저장 등) |
| encoder | appender에 포함되는 태그로, 출력될 로그의 형식을 지정한다. |
| logger | 로그를 출력하는 요소로 level 속성을 통해, 출력할 로그의 레벨을 조절하여 appender에 전달한다. |
| 레벨 | 설명 |
|---|---|
| trace | 모든 로그를 출력 |
| debug | 개발할 때 디버그 용도로 사용 |
| info | 상태 변경 등과 같은 정보성 메시지를 나타냄 |
| warn | 프로그램의 실행에는 문제가 없지만, 추후 시스템 에러의 원이이 될 수 있다는 경고성 메시지를 의미함. |
| error | 요청을 처리하던 중 문제가 발생한 것을 의미함. |
표에서 가장 윗줄이 가장 낮은 레벨이고, 아래로 갈수록 레벨이 높아지며 설정한 로그 레벨 이상 로그만 출력된다.
Spring boot는 자체적으로 log4j2나 Logback 등의 로깅 API를 제공한다. 그래서 특별한 설정을 하지 않더라도 기본적으로 여러 로그가 출력이 된다. 하지만 필요하지 않은 정보도 많고, 정렬이 되어 있지 않아 한눈에 로그 확인이 어렵다. 이런 문제들을 해결하기 위해 로그가 정렬되어 출력되고 쿼리에 대한 추가적 정보도 제공하는 Log4JDBC 라이브러리를 추가한다.
build.gradle 파일에 implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16' 라이브러리를 추가한다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.0'
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
implementation 'commons-io:commons-io:2.8.0'
implementation 'commons-fileupload:commons-fileupload:1.4'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
라이브러리 추가 후에는 반드시 gradle을 refresh 해야한다.

src/main/resource 폴더 밑에 log4jdbc.log4j2.properties 파일을 생성하고 아래와 같이 작성한다.
log4jdbc.spylogdelegator.name = net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength = 0
log4jdbc.auto.load.popular.drivers=false
log4jdbc.drivers=com.mysql.cj.jdbc.Driver
그리고 application.properties 파일로 가서 아래와 같이 작성한다.
spring.datasource.hikari.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.hikari.jdbc-url=jdbc:log4jdbc:mysql://localhost:3306/board?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false
logback-spring.xml에 가서 아래처럼 추가한다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%d %5p [%c] %m%n</Pattern>
</encoder>
</appender>
<appender name="console-infolog" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%d %5p %m%n</Pattern>
</encoder>
</appender>
<logger name="board" level="DEBUG" appender-ref="console"/>
<!-- 여기부터 -->
<logger name="jdbc.sqlonly" level="INFO" appender-ref="console-infolog"/>
<logger name="jdbc.resultsettable" level="INFO" appender-ref="console-infolog"/>
<!-- 여기까지 추가 -->
<root level="off">
<appender-ref ref="console"/>
</root>
</configuration>

다 하고 나면 이렇게 콘솔에 남는 것을 확인 할 수 있다.jdbc.sqlonly를 통해 SQL문을 보여주고, jdbc.resulttable을 통해 select 결과를 콘솔에 보여준다.
https://earth-95.tistory.com/41#Logback%EC%-D%B-%EB%-E%--%-F
https://congsong.tistory.com/23