Spring Boot 게시판 만들기 23 - Log4jdbc를 이용해 Query 로그 기록하기

23. Log4jdbc를 이용해 Query 로그 기록하기

로그 레벨

TRACE > DEBUG > INFO > WARN > ERROR

로그 레벨은 TRACE로 갈 수록 표현되는 Log의 양이 많아지고 ERROR로 갈 수록 표현되는 Log의 양이 적어진다.

Configure 파일 문법

Logback Configure파일을 구성하는 3가지 태그가 있다.

  • appender
    • 로그의 출력 위치, 출력 형식및 로깅에 대한 설정(ex. 기간, 용량 등)을 지정한다
  • root
    • 전역적인 로그 설정을 위해 사용한다.
    • appender를 사용해 appender에 정의된 형식과 위치로 로그를 출력
    • 여러개의 appender를 사용할 수 있다.
  • logger
    • root와는 반대로 class나 Package단위로 Logging 정책을 설정할 수 있다.
    • 로그 메시지를 작성하기 위해 사용하는 클래스를 명시하고 appender를 사용해 appender에 정의된 형식과 위치로 로그를 출력한다.
    • 여러개의 appender를 사용할 수 있다.

appender 클래스의 종류

  • ch.qos.logback.core.ConsoleAppender
    • 콘솔에 로그를 찍음
  • ch.qos.logback.core.FileAppender
    • 파일에 로그를 찍음
  • ch.qos.logback.core.rolling.RollingFileAppender
    • 여러개의 파일을 순회하면서 로그를 찍음
  • ch.qos.logback.classic.net.SMTPAppender
    • 로그를 메일에 찍어 보냄
  • ch.qos.logback.classic.db.DBAppender
    • 데이터베이스에 로그를 찍음

의존성 추가하기

쿼리 로그를 저장하기 위해서는 log4jdbc 의존성을 추가해줄 필요가 있다.

build.gradle

implementation group: 'com.integralblue', name: 'log4jdbc-spring-boot-starter', version: '2.0.0'

설정 추가하기

  • jdbc.sqlonly
    • SQL문만을 로그로 남긴다.
  • jdbc.sqltiming
    • SQL문과 해당 SQL을 수행한 시간을 로그로 남긴다.
  • jdbc.audit
    • ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다.
    • 많은 양의 로그를 생성하므로 JDBC 문제를 추적해야 할 필요를 죄외하고는 사용하지 않는다.
  • jdbc.resultset
    • ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남긴다.
    • 많은 양의 로그를 생성하므로 JDBC 문제를 추적해야 할 필요를 죄외하고는 사용하지 않는다.
  • jdbc.resultsettable
    • SQL문을 수행한 후 조회된 table을 로그로 남긴다.

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOGS_PATH" value="./logs"/>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>

<logger name="jdbc.sqlonly" level="INFO"/>

<root level="off">
<appender-ref ref="STDOUT"></appender-ref>
</root>
</configuration>

DataBase 접속 설정 추가하기

DataBase 접속 URL과 Driver를 변경해줄 필요가 있다. URL에서는 jdbc하고 접속하고 싶은 DB사이에 log4jdbc를 추가해주면 된다. Driver는 log4jdbc에서 제공해주는 Driver를 사용하면 된다.

  • url: jdbc:log4jdbc:h2:mem:testdb
  • driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy

appplication.yml

datasource:
# url: jdbc:h2:mem:testdb
url: jdbc:log4jdbc:h2:mem:testdb
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
username: sa
password:

Console에 SQL문이 찍히는 것을 확인할 수 있다. 이상하게 Memory DB를 사용하는 경우 SQL문이 중복으로 찍힌다.

MySQL 접속 설정 변경하기

H2 DataBase했던 것과 마찬가지로 Driver와 URL을 변경해준다.

application-mysql.yml

spring:
datasource:
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
# driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:log4jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=UTF-8
# url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=UTF-8
username: [DataBase ID]
password: [DataBase Password]

Create시 engine=InnoDB가 나타난 것을 보아 MySQL을 이용한 SQL문이 제대로 생성됨을 알 수 있다.

파일에 Log 출력하기

파일에 로그를 남기기 위해 appender 클래스로 ch.qos.logback.core.FileAppender를 사용할 것이다.

로그파일을 관리하는 정책 세우기

rollingPolicy 태그를 이용해 로그파일을 관리하는 정책을 세울 수 있다.

  • rollingPolicy
    • ch.qos.logback.core.rolling.RollingFileAppender
      • 일자별로 로그파일을 관리한다.
      • 일자가 바뀌면 fileNamePattern에 따라 별도의 로그파일이 생성된다.
    • timeBasedFileNamingAndTriggeringPolicy
      • 일자 외에도 파일의 용량에 따라 별도의 로그파일이 생성된다.
      • maxFileSize보다 로그 파일의 크기가 커지면 별도의 로그파일이 생성된다.

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOGS_PATH" value="./logs"/>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOGS_PATH}/logback.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d{yyyy-MM-dd HH:mm:ss}- %-5level - %msg%n</Pattern>
</encoder>

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOGS_PATH}/${LOG_PREFIX}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>

<!-- <logger name="jdbc.sqlonly" level="INFO"/>-->
<logger name="jdbc.sqlonly" level="INFO"/>

<root level="off">
<appender-ref ref="FILE"></appender-ref>
</root>
</configuration>

logs라는 폴더가 생성되고 여기에 logback.log라는 파일이 생성되 로그가 찍히는 것을 확인할 수 있다.

logback.log

http://logback.qos.ch/manual/index.html

Share