
Spring Boot로 프로젝트를 하다 보면, SQL 로그가 안 보여서 디버깅이 힘들다는 경우가 종종 있습니다.
이럴 땐 Log4jdbc-log4j2를 쓰면 해결됩니다. 쿼리, 파라미터, 실행시간까지 볼 수 있습니다.
1. 의존성 추가
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-log4j2'
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client' // DB 드라이버
}
<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4 -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
2. application.yml 설정
spring:
datasource:
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
url: jdbc:log4jdbc:mariadb://localhost:3306/demo_db
username: demo_user
password: demo_password
logging:
level:
root: info
jdbc:
sqlonly: debug
sqltiming: trace
resultsettable: off
audit: off
📌 url 앞에 jdbc:log4jdbc:를 붙여야 로그가 출력됩니다.
3. Log4j2 설정 파일 추가
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<timestamp key="BY_DATE" datePattern="yyyy-MM-dd"/>
<property name="LOG_PATH" value ="/usr/local/tomcat10-safety-daelim-8280/logs" />
<property name="LOG_PATTERN"
value="[%d{yyyy-MM-dd HH:mm:ss}:%-4relative] %green([%thread]) %highlight([%-5level]) [%logger] %boldWhite([%M:%yellow(%L)]) - %msg%n"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- SQL Logger -->
<logger name="jdbc.connection" additivity="false">
<level value="warn" />
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="jdbc.audit" additivity="false">
<level value="warn"/>
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="jdbc.resultset" additivity="false">
<level value="warn" />
<appender-ref ref="CONSOLE"/>
</logger>
<!-- info 하위만 표시-->
<logger name="jdbc.sqlonly" additivity="false">
<level value="info"/>
<appender-ref ref="CONSOLE"/>
</logger>
<!-- info 하위만 표시-->
<logger name="jdbc.resultsettable" additivity="false">
<level value="info"/>
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="jdbc.sqltiming" additivity="false">
<level value="warn" />
<appender-ref ref="CONSOLE"/>
</logger>
<!-- [Fatal > Error > Warn > Info > Debug > Trace] 로그 레벨 -->
<!-- .java에서 Logger.info()인경우 상위만 표시-->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.log4j2.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0
log4jdbc.dump.sql.select=false
log4jdbc.dump.sql.insert=true
log4jdbc.dump.sql.update=true
log4jdbc.dump.sql.delete=true
log4jdbc.trim.sql=true
log4jdbc.suppress.generated.keys=false
📌 사용하는 경우?
SELECT 쿼리만 로그에 너무 많이 찍혀서 로그 더미가 될 때 → log4jdbc.dump.sql.select=false
INSERT/UPDATE/DELETE만 보고 싶을 때
SQL 라인이 너무 길어서 보기 힘들 때 → maxlinelength 조절
로그 포맷을 커스터마이징하고 싶을 때
4. 실행 후 로그 확인
애플리케이션을 실행하면 아래와 같은 로그가 출력됩니다:
[12:34:56.789] DEBUG jdbc.sqlonly - SELECT * FROM users WHERE id = ?
[12:34:56.790] TRACE jdbc.sqltiming - SELECT * FROM users WHERE id = ? :: 3 ms
5. 추가 팁: 환경별 설정 분리
운영환경에서는 로그 레벨을 낮추고 싶다면?
# application.yml
spring:
profiles:
active: local
# application-local.yml
logging:
level:
jdbc:
sqltiming: trace
# application-prod.yml
logging:
level:
jdbc:
sqltiming: off
📌 운영 DB에서 무분별하게 쿼리 로그 찍히는 걸 방지할 수 있습니다.