Log - (3) Log4jdbc+Logback을 이용한 SQL 로그 남기기

단비·2023년 5월 22일
0

학습

목록 보기
61/66

logback을 사용하여 SQL문이 실행되었을 때 자동으로 log 남기기

사용 방법


1. build.gradle

  • logback과 log4jdbc 추가
// 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'



2. application.yml

수정 전

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



3. logback-spring.xml

  • 하기 설정 추가 후 appender 자유롭게 설정
<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"/>

logger를 이용한 log 환경설정

타입설명
sqlonlySQL을 로그로 남기며, Prepared Statement와 관련된 파라미터는 자동으로 변경되어 SQL을 출력합니다.
sqltimingSQL과 SQL 실행 시간(milliseconds 단위)을 출력합니다.
auditResultSet을 제외한 모든 JDBC 호출 정보를 출력합니다. JDBC 관련 문제를 추적하는 경우를 제외하고는 사용이 권장되지 않습니다.
resultsetResultSet을 포함한 모든 JDBC 호출 정보를 출력합니다.
resultsettableSQL 조회 결과를 테이블 형태로 출력합니다.
connectionConnection의 연결과 종료에 관련된 로그를 출력합니다. 커넥션 누수 문제 해결에 도움이 됩니다.



4. log4jdbc.log4j2.properties

# 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







💡TIPS!


위 설정대로 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

profile
tistory로 이전! https://sweet-rain-kim.tistory.com/

0개의 댓글