본문 바로가기
SpringBoot/(책)스프링부트 시작하기

[springboot] 5-1. Log4JDBC로 쿼리 로그 정렬하기

by 평범한kiki 2023. 4. 23.

* Log4JDBC로 쿼리 로그 정렬하기

 

- 예전에 사용되던 log4jdbc-remix lib는 개발이 종료 되었다고 한다.
  후속버전으로 Log4jdbc-log4j2가 개발됨

 

1. lib 추가
board\build.gradle

- implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16' 추가해준다

   group: org.bgee.log4jdbc-log4j2

   name: log4jdbc-log4j2-jdbc4.1

   version: 1.16

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	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'
	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'
}

 

2. log4jdbc 설정하기
 1) /resources/log4jdbc.log4j2.properties 추가

     파일이름이 다를 경우 정상적으로 동작하지 않는다. 이름을 반드시 log4jdbc.log4j2.properties 하자

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
#이걸로 쿼리가 줄바꿈이 된다
log4jdbc.dump.sql.maxlinelength=0

 #Loading class com.mysql.jdbc.Driver'. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver' 때문에 추가
log4jdbc.auto.load.popular.drivers=false
log4jdbc.drivers=com.mysql.cj.jdbc.Driver


 2) /resources/application.properties 설정 
    driver-class-name,URL 변경

#log4jdbc적용후
spring.datasource.hikari.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.hikari.jdbc-url=jdbc:log4jdbc:mysql://localhost:3306/web_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC

#log4jdbc적용전
#spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver 
#spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/web_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC


 3) /resources/logback-spring.xml  에 logger  설정 추가

   - 쿼리 <logger name="jdbc.sqlonly" level="INFO" appender-ref="console-infolog"/>      
   - 실행결과 <logger name="jdbc.resultsettable" level="INFO" appender-ref="console-infolog"/> 

  - <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 도 추가했다

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

	<!-- 변수 지정 -->
    <property name="LOG_DIR" value="/logs" />
    <property name="LOG_PATH_NAME" value="${LOG_DIR}/data.log" />
	
	<!--appender는 로그를 어디에 출력할지 결정(콘솔,파일기록,DB저장등)-->
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
	      <!--<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>-->
	      <pattern>%d %-5p %m%n</pattern>
	    </encoder>
     </appender>
	<appender name="console-infolog" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
	      <pattern>%d %-5p %m%n</pattern>
	    </encoder>
     </appender>  
	 <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_PATH_NAME}</File>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%F]%M\(%L\) : %m%n</pattern>
        </encoder>
         <!-- 일자별로 로그파일 적용하기 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH_NAME}.%d{yyyyMMdd}</fileNamePattern>
            <maxFileSize>20MB</maxFileSize>
            <maxHistory>50</maxHistory> <!-- 일자별 백업파일의 보관기간 -->
            <totalSizeCap>1000MB</totalSizeCap>
        </rollingPolicy>
	 </appender>
	    
     <!--로거는 로그를 출력하는 ㅇ소로 Level 속성을 통해서 출력할 로그의 레벨을 조절하여 appender에 전달-->
     <!-- debug레벨의 로그를 출력하는 형식은 console이라는 이름의 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" />
	    <appender-ref ref="FILE" />
	  </root>
</configuration>

 

* log4jdbc는 다음과 같은 로거를 제공

로거  
jdbc.sqlonly SQL를 보여줌. Prepared statement의 경우 파라미터 자동으로 변경되어 출력
jdbc.sqltiming SQL문과 해당 SQL문의 실행 시간을 밀리초 단위로 보여줌
jdbc.audit resultset를 제외한 모든 JDBC 정보를 보여줌. 발생하는 로그가 많아 JDBC문제 추적하기 위한 것이 아니면 일반적으로 사용하지 않음
jdbc.resultset resultset를 포함한 모든 JDBC 정보를 보여주기 때문에 jdbc.audit 더 많은 로그 생성됨
jdbc.resulttable SQL의 조회결과를 테이블로 보여줌
jdbc.connection connection의 연결과 종료에 관련된 로그 보여줌



참고) http://log4jdbc.brunorozendo.com/

     https://taetaetae.github.io/2017/02/19/logback/