-
[Spring Boot] REST API 만들기(3) - Logback 설정Spring Boot/2.4.x - REST API 만들기 2020. 5. 4. 17:23반응형
1. Logback 이란?
Logback "자바 오픈소스 로깅 프레임워크"로 SLF4J의 구현체입니다. 스프링 부트의 기본으로 설정되어 있어서 dependency를 추가하지 않아도 사용 가능합니다.
2. Logback 사용법
org.slf4j.Logger와 org.slf4j.LoggerFactory를 import하고, LoggerFactory를 통해 logger를 주입 받으세요.
BoardController.java
더보기123456789101112131415161718192021222324252627282930313233package com.api.board.controller;import java.util.List;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.api.board.domain.Board;import com.api.board.service.BoardService;@RequestMapping(value = "/board")@RestControllerpublic class BoardController {private final Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate BoardService boardService;@GetMappingpublic List<Board> getBoardList() throws Exception {logger.info("===== ===== ===== =====");logger.info("BoardController.getBoardList()");logger.info("===== ===== ===== =====");return boardService.getBoardList();}}cs 3. 로그 레벨
로그에 설정할 수 있는 레벨은 총 5가지로 설정한 레벨 이상의 로그를 출력합니다. 예를 들어 로그 레벨 설정을 "INFO"로 하였을 경우 "TRACE", "DEBUG" 레벨은 출력되지 않습니다.
TRACE < DEBUG < INFO < WARN < ERROR
TRACE : TRACE 레벨은 DEBUG 레벨보다 상세한 정보를 나타냅니다.
DEBUG : 프로그램을 디버깅하기 위한 정보를 표시합니다.
INFO : 상태 변경과 같은 정보성 로그를 표시합니다.
WARN : 처리 가능한 문제, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를 나타냅니다.
ERROR : 요청을 처리하는 중 오류가 발생한 경우 표시합니다.
4. application.properties에서 로깅 레벨 설정
application.properties에서 root 로깅 레벨 설정하거나, 패키지 단위(logging.level.패키지)로 로깅 레벨 설정할 수 있습니다.
application.properties
더보기12345678910spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/board?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTCspring.datasource.hikari.username=boardspring.datasource.hikari.password=password1!# root 로깅 레벨 설정logging.level.root=info# 패키지 단위로 로깅 레벨 설정logging.level.com.api.board=infologging.level.com.api.board.controller=debugcs BoardController.java
더보기12345678910111213141516171819202122232425262728293031323334353637package com.api.board.controller;import java.util.List;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.api.board.domain.Board;import com.api.board.service.BoardService;@RequestMapping(value = "/board")@RestControllerpublic class BoardController {private final Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate BoardService boardService;@GetMappingpublic List<Board> getBoardList() throws Exception {logger.info("===== ===== ===== logging.level.com.api.board.controller - Logger Level ===== ===== =====");logger.trace("Logger Level - [TRACE]");logger.debug("Logger Level - [DEBUG]");logger.info("Logger Level - [INFO]");logger.warn("Logger Level - [WARN]");logger.error("Logger Level - [ERROR]");logger.info("===== ===== ===== logging.level.com.api.board.controller - Logger Level ===== ===== =====");return boardService.getBoardList();}}cs BoardService.java
더보기12345678910111213141516171819202122232425262728293031323334package com.api.board.service;import java.util.List;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.api.board.domain.Board;import com.api.board.mapper.BoardMapper;@Servicepublic class BoardService {private final Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate BoardMapper boardMapper;/** 게시글 목록 조회 */public List<Board> getBoardList() throws Exception {logger.info("===== ===== ===== logging.level.com.api.board - Logger Level ===== ===== =====");logger.trace("Logger Level - [TRACE]");logger.debug("Logger Level - [DEBUG]");logger.info("Logger Level - [INFO]");logger.warn("Logger Level - [WARN]");logger.error("Logger Level - [ERROR]");logger.info("===== ===== ===== logging.level.com.api.board - Logger Level ===== ===== =====");return boardMapper.getBoardList();}}cs 5. logback-spring.xml 설정
logback-spring.xml은 appender와 logger로 나누어지는데 appender는 콘솔, 파일, DB 등 로그를 출력하는 방법을 지정할 수 있으며, logger는 출력할 위치를 설정할 수 있습니다.
classpath(resource 에 logback-spring.xml 파일이 있으면 설정된 정보를 참조하고 logback-spring.xml 파일이 없다면 .properties 파일의 설정된 정보를 참조합니다.
5_1. application.properties 설정
logback profile 설정을 설정하세요.
application.properties
더보기12345678910111213spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/board?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTCspring.datasource.hikari.username=boardspring.datasource.hikari.password=password1!# root 로깅 레벨 설정logging.level.root=info# 패키지 단위로 로깅 레벨 설정logging.level.com.api.board=infologging.level.com.api.board.controller=debug# profiles 설정spring.profiles.active=localcs 5_2. logback-local.properties 추가
src/main/resources 폴더에 logback-local.properties를 추가한 후 로그 경로와 로그 파일명을 설정하세요.
logback-local.properties
5_3. logback-spring.xml 추가
src/main/resources 폴더에 logback-spring.xml를 추가한 후 logback에 대한 내용을 설정하세요.
logback-spring.xml
더보기1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495<?xml version="1.0" encoding="UTF-8"?><!-- 60초마다 설정 파일의 변경을 확인 하여 변경시 갱신 --><configuration scan="true" scanPeriod="60 seconds"><!--springProfile 태그를 사용하면 logback 설정 파일에서 복수개의 프로파일을 설정 --><springProfile name="local"><property resource="logback-local.properties" /></springProfile><springProfile name="dev"><property resource="logback-dev.properties" /></springProfile><!--Environment 내의 프로퍼티들을 개별적으로 설정 --><springProperty scope="context" name="LOG_LEVEL" source="logging.level.root"/><!-- log file path --><property name="LOG_PATH" value="${log.config.path}" /><!-- log file name --><property name="LOG_FILE_NAME" value="${log.config.filename}" /><!-- err log file name --><property name="ERR_LOG_FILE_NAME" value="err_log" /><!-- pattern --><property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] [%-5level] %logger{36} - %msg%n" /><!-- Console Appender --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${LOG_PATTERN}</pattern></encoder></appender><!-- File Appender --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 파일경로 설정 --><file>${LOG_PATH}/${LOG_FILE_NAME}.log</file><!-- 출력패턴 설정 --><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${LOG_PATTERN}</pattern></encoder><!-- Rolling 정책 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 --><fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- 파일당 최고 용량 kb, mb, gb --><maxFileSize>10MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거 --><maxHistory>30</maxHistory><!--<MinIndex>1</MinIndex><MaxIndex>10</MaxIndex> --></rollingPolicy></appender><!-- 에러의 경우 파일에 로그 처리 --><appender name="Error" class="ch.qos.logback.core.rolling.RollingFileAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>error</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><file>${LOG_PATH}/${ERR_LOG_FILE_NAME}.log</file><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>${LOG_PATTERN}</pattern></encoder><!-- Rolling 정책 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 --><fileNamePattern>${LOG_PATH}/${ERR_LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- 파일당 최고 용량 kb, mb, gb --><maxFileSize>10MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거 --><maxHistory>60</maxHistory></rollingPolicy></appender><!-- root레벨 설정 --><root level="${LOG_LEVEL}"><appender-ref ref="CONSOLE" /><appender-ref ref="FILE" /><appender-ref ref="Error" /></root><!-- 특정패키지 로깅레벨 설정 --><logger name="org.apache.ibatis" level="DEBUG" additivity="false"><appender-ref ref="CONSOLE" /><appender-ref ref="FILE" /><appender-ref ref="Error" /></logger></configuration>cs 5_4. Console에서 로그 확인
5_5. 로그 파일 생성 확인
소스 코드는 Github Repository - https://github.com/tychejin1218/api-board_v1 (branch : section03) 를 참조하세요.
Github에서 프로젝트 가져오기 - https://tychejin.tistory.com/33반응형'Spring Boot > 2.4.x - REST API 만들기' 카테고리의 다른 글
[Spring Boot] REST API 만들기(6) - Interceptor 적용 (1) 2020.05.07 [Spring Boot] REST API 만들기(5) - Mapper 구현 및 단위 테스트(Junit4) (0) 2020.05.06 [Spring Boot] REST API 만들기(4) - Log4jdbc 설정 (0) 2020.05.05 [Spring Boot] REST API 만들기(2) - MySQL + MyBatis 연동 (0) 2020.05.03 [Spring Boot] REST API 만들기(1) - 프로젝트 생성 (0) 2020.04.29