* 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/
'SpringBoot > (책)스프링부트 시작하기' 카테고리의 다른 글
[springboot] 7. AOP 사용하기 (0) | 2023.04.23 |
---|---|
[springboot] 6. HandlerInterceptor(인터셉터) 사용하기 (0) | 2023.04.23 |
[springboot] 5. springboot Logback 설정하기 (0) | 2023.04.23 |
[springboot] 3-3. springboot mybatis typeAliases 설정하기 (0) | 2023.04.23 |
[springboot ] 5. Spring-Boot에 mapper 만들기 (0) | 2023.04.22 |