Spring Boot 게시판 구현하기 6 (로그 추가하기)
'[책] 스프링부트 시작하기 (김인우)'를 공부하면서 적은 내용입니다.
Logback 사용하기
Logback 이란?
Log4j를 기반으로 작성된 로그 라이브러리.
Log4j와 비교해서 성능이 10배정도 빠르고 메모리 사용량이 적다.
Logback은 로그 설정이 변경될 경우 내부의 설정 변화 감지 스레드가 이를 감지하여 반영하기 때문에
재시작 없이 바로 반영된다.
Logback은 로깅 구현체 중 하나로 slf4j(Simple Logging Facade for Java)를 함께 사용한다.
slf4j는 바자의 다양한 로그 모듈들의 추상체라고 할 수 있다. (자바의 인터페이스와 비슷한 역활)
API를 이용할 경우 실제 로깅을 담당하는 로깅 구현체의 종류와 상관없이 일관된 로그 코드를 작성할 수 있다.
로그 출력 등 로깅 코드는 slf4j를 이용하면 내부적으로는 Logback이나 log4j2와 같은 로깅 구현체가 그 기능을 구현
Logback 설정하기
src/main/resources 폴더 밑에 logback-spring.xml 파일을 생성하고 하기 내용을 작성
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- Appenders -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- debug 용 -->
<encoder>
<Pattern>%d %5p [%c] %m%n</Pattern>
</encoder>
</appender>
<appender name="console-infolog" class="ch.qos.logback.core.ConsoleAppender">
<!-- info 레벨 -->
<encoder>
<Pattern>%d %5p %m%n</Pattern>
</encoder>
</appender>
<!-- 로거 -->
<logger name="board" level="DEBUG" appender-ref="console"/>
<!-- 루트 로거 -->
<root level="off">
<appender-ref ref="console"/>
</root>
</configuration>
Logback의 주요 구성 요소
appender : 로그를 어디에 출력할지 결정하는 역할
encoder : appender에 포함되어 출력할 로그를 지정한 형식으로 변환하는 역할을 한다.
logger : 로그를 출력하는 요소. Level 속성을 통해서 출력할 로그의 레벨을 조정하여 appender 에 전달, debug 레벨의 로그를 출력하는 형식은 <appender> 속성에 적힌 console이라는 이름을 가진 appender를 사용한다.
Logback에서 사용하는 로그 레벨
trace | 모든 로그를 출력 |
debug | 상태 변경 등과 같은 정보성 메시지를 나타낸다. |
info | 상태 변경 등과 같은 정보성 메시지를 나타낸다. |
warn | 프로그램의 실행에는 문제가 없지만, 추후 시스템 에러의 원인이 될 수 있다는 경고성 메시지를 의미 |
error | 요청을 처리하던 중 문제가 발생한 것을 의미 |
Logback 사용하기
로그를 사용하려는 클래스에서 아래의 로거를 생성
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Logger log = LoggerFactory.getLogger(this.getClass());
getLogger() 메서드의 파라미터는 로거의 이름이다. 모든 로거는 이름을 기반으로 생성
getLogger("NAME") 으로 생성하면 NAME 이라는 이름을 가진 로거 인스턴스 하나를 반환한다.
클래스 객체를 넘겨주면 로거의 이름은 "패키지이름 + 클래스 이름 "으로 구성된다.
로그를 출력하는 메소드는 아래와 같이 사용되고 원하는 레벨의 로그를 호출하면 된다.
log.trace("trace level log");
log.debug("debug level log");
log.info("info level log");
log.warn("warm level log");
log.error("error level log");
BoardController 클래스에 로거를 적용
BoardController.java
Log4JDBC로 쿼리 로그 정렬하기
SpringBoot는 자체적으로 log4j2나 Logback 등의 로깅 API를 제공해므로 특별한 설정을 하지 않더라도 기본적으로 여러 로그가 출력된다. 쿼리 로그 역시 마찬가지이다.
라이브러리 추가하기
build.gradle 에 아래 라이브러리 추가하기
implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
log4jdbc 설정하기
log4jdbc.log4j2.properties 생성 및 설정
log4jdbc.spylogdelegator.name = net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength = 0
application.properties 설정
application.properties 파일 설정 변경
: driver-class-name과 URL을 변경
변경 전
spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/insight?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul
변경 후
spring.datasource.hikari.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.hikari.jdbc-url=jdbc:log4jdbc:mysql://localhost:3306/insight?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul
logback-spring.xml 설정
logback-spring.xml
쿼리 및 실행 결과를 보여주는 로거가 추가 되는 것이다. (board 로거 밑에 추가)
<!-- 로거 -->
<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"/>
log4jdbc가 제공하는 로거 종류
로거 | 설명 |
jdbc.sqlonly | SQL 을 보여준다. Prepared statement의 경우 관련 파라미터는 자동으로 변경되어 출력 |
jdbc.sqltiming | SQL문과 해당 SQL 문의 실행 시간을 밀리초 단위로 보여준다 |
jdbc.audit | ResultSets을 제외한 모든 JDBC 호출 정보를 보여준다. 매우 많은 로그가 발생되므로, JDBC 관련 문제를 추적하기 위한 것이 아니라면 일반적으로 사용하지 않는다. |
jdbc.resultset | ResultSets를 포함한 모든 JDBC 호출 정보를 보여주므로 jdbc.audit보다 더 많은 로그가 생성된다. |
jdbc.resulttable | SQL의 조회 결과를 테이블로 보여 준다 |
jdbc.connection | Connection의 연결과 종료에 관련된 로그를 보여줍니다. Connection 누수(leak) 문제를 해결하는 데 도움이 됩니다. |
실행 결과 확인
오류 >
Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
이런 오류가 나왔는데 이는 Mysql의 버전이 향상되어 해당 driver의 명칭이 바뀌었기 때문이다.
log4jdbc.log4j2.properties 파일에 아래에 내용을 추가
log4jdbc.drivers=com.mysql.cj.jdbc.Driver
log4jdbc.auto.load.popular.drivers=false