logback을 사용하여 SQL문이 실행되었을 때 자동으로 log 남기기
// https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4.1
implementation group: 'org.bgee.log4jdbc-log4j2', name: 'log4jdbc-log4j2-jdbc4.1', version: '1.16'
// https://mvnrepository.com/artifact/ch.qos.logback/logback-classic
testImplementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.4.7'
수정 전
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.0.218:3306/task?serverTimezone=Asia/Seoul
수정 후
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
url: jdbc:log4jdbc:mysql://127.0.0.1:3306/task?serverTimezone=Asia/Seoul
<logger name="jdbc" level="OFF"/>
<!-- sql문만 로깅할지 여부 -->
<logger name="jdbc.sqlonly" level="INFO"/>
<!-- 쿼리문 수행시간 로깅 여부 -->
<logger name="jdbc.sqltiming" level="INFO"/>
<!-- ResultSet외 모든 JDBC 호출 정보 로깅할지 여부 -->
<logger name="jdbc.audit" level="OFF"/>
<!-- ResultSet 포함 모든 JDBC 호출 정보를 로깅 -->
<logger name="jdbc.resultset" level="OFF"/>
<logger name="jdbc.resultsettable" level="DEBUG"/>
<!-- connection open close 로깅 여부 -->
<logger name="jdbc.connection" level="OFF"/>
타입 | 설명 |
---|---|
sqlonly | SQL을 로그로 남기며, Prepared Statement와 관련된 파라미터는 자동으로 변경되어 SQL을 출력합니다. |
sqltiming | SQL과 SQL 실행 시간(milliseconds 단위)을 출력합니다. |
audit | ResultSet을 제외한 모든 JDBC 호출 정보를 출력합니다. JDBC 관련 문제를 추적하는 경우를 제외하고는 사용이 권장되지 않습니다. |
resultset | ResultSet을 포함한 모든 JDBC 호출 정보를 출력합니다. |
resultsettable | SQL 조회 결과를 테이블 형태로 출력합니다. |
connection | Connection의 연결과 종료에 관련된 로그를 출력합니다. 커넥션 누수 문제 해결에 도움이 됩니다. |
# log4jdbc spy의 로그 이벤트를 slf4j를 통해 처리한다.
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
# 로그를 표시할 줄의 제한, 0은 무제한
log4jdbc.dump.sql.maxlinelength=0
# mysql.cj.jdbc.Driver Error 오류 방지
log4jdbc.auto.load.popular.drivers=false
log4jdbc.drivers=com.mysql.cj.jdbc.Driver
위 설정대로 log 출력 시 Spring의 기본 로그들도 함께 저장된다
이럴 경우 root에 appender를 설정하는게 아닌
log4jdbc 설정에 직접 appender를 설정해주는 방법이 있다
<logger name="jdbc.sqltiming" level="${LOG_STATUS}">
<appender-ref ref="query-log" />
</logger>
<root>
<!--<level value="${logStatus}"/>-->
<!--<appender-ref ref="query-log"/>-->
</root>
이렇게 하면 스프링 기본 로그들이 파일에 같이 저장되지는 않는데
스프링 콘솔에서도 안찍힌다..
이 방법은 아무리 검색해도 안나온다
별도로 직접 appender를 주지 않고 일일히 시스템 로그를 OFF 시키는 방법도 있다
하지만 아래와 같이 설정하면 프로젝트 start와 같은 로그 세 줄 정도는 같이 저장된다
<logger name="org.springframework" level="OFF" />
<logger name="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver" level="OFF" />
<logger name="org.springframework.beans.factory" level="OFF" />
<logger name="org.springframework.jdbc.support" level="OFF" />
<logger name="org.apache" level="OFF" />
<logger name="net.sf.ehcache" level="OFF" />
<logger name="org.apache.ibatis" level="OFF" />
<logger name="org.aspectj" level="OFF" />
<logger name="org.mybatis.spring" level="OFF" />
<logger name="com.zaxxer.hikari" level="OFF" />
<logger name="com.zaxxer.hikari.HikariConfig" level="OFF" />
<logger name="org.hibernate" level="OFF" />
<logger name="javax.management" level="OFF" />
<logger name="org.springframework.cache" level="OFF" />
스프링 부트(Spring Boot) - Logback을 이용해서 SQL 쿼리 로그 출력하기 [MariaDB, Gradle, MyBatis]
[Spring] Spring Boot 시작하기 (5) - log4jdbc를 이용한 Query로깅
[Spring Boot] log4jdbc mysql.cj.jdbc.Driver Error