Programming/Spring

[스프링부트 (5)] Spring Boot Log 설정(1) - Logback

byeong07 2022. 5. 29. 22:39

이번 포스팅은 [ 스프링 부트  Log 설정 - 로그백입니다.  : -) 

 

 

 

 

1. Logback 이란? 특징?

 - 자바 오픈소스 로깅 프레임워크,  SLF4J의 구현체
 - 스프링 부트의 기본으로 설정되어 있어서 사용시 별도로 라이브러리를 추가하지 않아도 된다.
 - log4j, log4j2 등과 성능을 비교했을 때에도 logback이 더 훌륭한 성능을 보여준다.
 - spring-boot-starter-web 안에 spring-boot-starter-logging에 구현체가 있다.
 - Logback을 이용하여 로깅을 수행하기 위해서 필요한 주요 설정요소로는 Logger, Appender, Encoder의 3가지가 있으며 각각은 다음과 같은 역할을 수행한다.


 - log4j, logback 기초 정리 내용 참고! (https://goddaehee.tistory.com/45)
 - 공식 매뉴얼 참고! (http://logback.qos.ch/manual/index.html)
 - 스프링부트 doc 참고 ! (https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-logging)

 

 

1. Spring boot logback 설정

▶ CASE)  스프링,  일반 자바프로그램의 경우

 - logback.xml 파일을 resources 디렉토리에 만들어서 참조한다.

 

▶ CASE)  스프링 부트

 - logback-spring.xml 파일을 resources 디렉토리에 만들어서 참조한다.

 

 - 참고 순서

1) classpath(resources디렉토리 밑)에 logback-spring.xml파일이 있으면 설정파일을 읽어간다.
2) logback-spring.xml파일이 없다면 .yml(.properties)파일의 설정을 읽어간다.
3) logback-spring.xml파일과 .yml(.properties)파일이 동시에 있으면 .yml(.properties) 설정 파일을 적용 후 xml파일이 적용된다.
 - 위에서 얘기한 대로 스프링 부트 에서는 logback-spring.xml을 사용해서 Spring이 logback을 구동할 수 있도록 지원해 주며 이를 이용하여 profile, 즉 배포 환경에 따른(spring.profiles.active을 활용하여) application.xml에 설정된 properties를 읽어올 수 있다.

 

ex) spring.profiles.active=local
logback-local.properties => console-logging
logback-dev.properties => file-logging
logback-prod.properties => file-logging,remote-logging

 

스프링 프로파일에 따른 설정 방법은 추후 하단의 예제소스를 통해 살펴보도록 하자.

 

 

2. 로그 레벨 순서 및 사용방법

TRACE  DEBUG  <  INFO  <  WARN ERROR

1) ERROR : 요청을 처리하는 중 오류가 발생한 경우 표시한다.

2) WARN  : 처리 가능한 문제, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를 나타낸다.

3) INFO  : 상태변경과 같은 정보성 로그를 표시한다.
4) DEBUG : 프로그램을 디버깅하기 위한 정보를 표시한다. 
5) TRACE : 추적 레벨은 Debug보다 훨씬 상세한 정보를 나타낸다. 

 

 - 로그에 설정할 수 있는 레벨은 총 5가지다.

 - 위의 순서대로 높은 레벨을 가진다. 출력 레벨의 설정에 따라 설정 레벨 이상의 로그를 출력 한다.

 - 예를 들어 로깅 레벨 설정을 "INFO"로 하였을 경우 "TRACE", "DEBUG" 레벨은 무시한다.

 

※ 스프링 부트에서는 간단히 application.properties에 값만 세팅해도 설정 가능 하다. 

ex1) 루트 레벨(전체 레벨) 전체 로깅 레벨 지정

logging.level.root=info

 

ex2) 패키지별로 로깅 레벨 지정

 - 다음 방법으로 상위 패키지의 디폴트 레벨을 설정하고, 하위 패키지들에 대한 각각의 로깅 레벨을 별도로 설정할 수 있다.

logging.level.com.god.bo.test=info 
logging.level.com.god.bo.test.controller=debug

 

▶ logger 등록 및 사용방법

 - LoggerFactory에서 로거 객체를 불러온 후, 로거 객체를 이용해서 코드의 원하는 부분에 로그를 찍으면 된다. 

 - 이부분은 다음 예시 소스를 확인하자.

 

※ 설정 예시 (Sample Source)

1) 전체 level 설정 = info

2) 특정 컨트롤러 패키지 Log Level 설정 = (com.god.bo.test.controller = debug)

logging.level.root=info
logging.level.com.god.bo.test=info
logging.level.com.god.bo.test.controller=debug

 

3) 각각의 컨트롤러, 서비스에는 다음과 같이 레벨별(trace ~ error) 로그 출력 처리 하였다.

 

ex) debug로깅 레벨 설정한 패키지의 controller

package com.god.bo.test.controller;

@Controller
public class TestController {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @RequestMapping(value = "/test")
    public ModelAndView test() throws Exception{

        logger.trace("Trace Level 테스트");
        logger.debug("DEBUG Level 테스트");
        logger.info("INFO Level 테스트");
        logger.warn("Warn Level 테스트");
        logger.error("ERROR Level 테스트");

        return mav;
    }
}

 

ex) 서비스

package com.god.bo.test.service;

@Service
public class TestService {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    public TestMapper mapper;

    public List<TestVo> selectTest() {
        logger.trace("Trace Level 테스트");
        logger.debug("DEBUG Level 테스트");
        logger.info("INFO Level 테스트");
        logger.warn("Warn Level 테스트");
        logger.error("ERROR Level 테스트");
        return mapper.selectTest();
    }
}

 

=> 결과

 

 

※ 패키지별로 로그 레벨 설정이 가능한 것을 확인 할 수 있다.

 

 

3. logback-spring.xml 설정

▶ 기본 특징

※ 대소문자 구별하지 않는다.

 - <logger> == <LOGGER>
※ name attribute를 반드시 지정해야 한다.
Logback-spring.xml은 appender와 logger 크게 두개로 구분된다.
 Dynamic Reloading 기능을 지원한다.
ex) 60초 주기마다 로그파일(logback-spring.xml)이 바뀌었는지 검사하고 바뀌었으면 프로그램 갱신한다.

<?xml version="1.0" encoding="UTF-8"?>
<!-- 60초마다 설정 파일의 변경을 확인 하여 변경시 갱신 -->
<configuration scan="true" scanPeriod="60 seconds">
    로그백 설정 부분
</configuration>

 

 

▶ 1) appender 

 - log의 형태를 설정, 로그 메시지가 출력될 대상을 결정하는 요소

 (콘솔에 출력할지, 파일로 출력 할지 등의 설정)

 

 - appender의 class의 종류

1) ch.qos.logback.core.ConsoleAppender : 콘솔에 로그를 찍음, 로그를 OutputStream에 작성하여 콘솔에 출력되도록 한다.

2) ch.qos.logback.core.FileAppender : 파일에 로그를 찍음, 최대 보관 일 수 등를 지정할 수 있다.

3) ch.qos.logback.core.rolling.RollingFileAppender : 여러개의 파일을 롤링, 순회하면서 로그를 찍는다.(FileAppender를 상속 받는다. 지정 용량이 넘어간 Log File을 넘버링 하여 나누어 저장할 수 있다.)

4) ch.qos.logback.classic.net.SMTPAppender : 로그를 메일에 찍어 보낸다.

5) ch.qos.logback.classic.db.DBAppender : DB(데이터베이스)에 로그를 찍는다. 

 

기타 내용은 다음 사이트에서 확인하자. (SocketAppender, SSLSocketAppender 등등)
참고 : https://logback.qos.ch/manual/appenders.html

 

 

▶ 2) root, logger

 - 설정한 appender를 참조하여 package와 level을 설정한다.

 

2.1) root

 - 전역 설정이라고 볼 수 있다.
 - 지역적으로 선언된 logger 설정이 있다면 해당 logger 설정이 default로 적용된다.

 

2.2) logger

 - 지역 설정이라고 볼 수 있다.
 - additivity 값은 root 설정 상속 유무 설정.(default = true)

 

▶ 3) property

 - 설정파일에서 사용될 변수값 선언

 

 

▶ 4) layout, encoder

 - Layout : 로그의 출력 포맷을 지정한다. log4j 에서 설정할때 많이 사용했을 것이다.
   참고 : http://logback.qos.ch/manual/layouts.html
 - encoder : Appender에 포함되어 사용자가 지정한 형식으로 표현 될 로그메시지를 변환하는 역할을 담당하는 요소
   encoder는 바이트를 소유하고 있는 appender가 관리하는 OutputStream에 쓸 시간과 내용을 제어할 수 있다.
   FileAppender와 하위 클래스는 encoder를 필요로 하고 더 이상 layout은 사용하지 않는다.
즉 이제 layout보다는 encoder를 사용하면 된다.

 

 

▶ 5) pattern

[ 패턴에 사용되는 요소 ]

 

%Logger{length} : Logger name을 축약할 수 있다. {length}는 최대 자리 수, ex)logger{35}
%-5level : 로그 레벨, -5는 출력의 고정폭 값(5글자)
%msg : - 로그 메시지 (=%message)
${PID:-} : 프로세스 아이디
%d : 로그 기록시간
%p : 로깅 레벨
%F : 로깅이 발생한 프로그램 파일명
%M : 로깅일 발생한 메소드의 명
%l : 로깅이 발생한 호출지의 정보
%L : 로깅이 발생한 호출지의 라인 수
%thread : 현재 Thread 명
%t : 로깅이 발생한 Thread 명
%c : 로깅이 발생한 카테고리
%C : 로깅이 발생한 클래스 명
%m : 로그 메시지
%n : 줄바꿈(new line)
%% : %를 출력
%r : 애플리케이션 시작 이후부터 로깅이 발생한 시점까지의 시간(ms)

 

▶ etc

<file>
기록할 파일명과 경로를 설정한다.

<rollingPolicy class>
ch.qos.logback.core.rolling.TimeBasedRollingPolicy => 일자별 적용
ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP => 일자별 + 크기별 적용

<fileNamePattern>
파일 쓰기가 종료된 log 파일명의 패턴을 지정한다.
.gz나 .zip으로 자동으로 압축할 수도 있다.

<maxFileSize>
한 파일당 최대 파일 용량을 지정한다.
log 내용의 크기도 IO성능에 영향을 미치기 때문에 되도록이면 너무 크지 않은 사이즈로 지정하는 것이 좋다.(최대 10MB 내외 권장)
용량의 단위는 KB, MB, GB 3가지를 지정할 수 있다.
RollingFile 이름 패턴에 .gz 이나 .zip을 입력할 경우 로그파일을 자동으로 압축해주는 기능도 있다.

<maxHistory>
최대 파일 생성 갯수
예를들어 maxHistory가 30이고 Rolling정책을 일 단위로 하면 30일동안만 저장되고, 월 단위로 하면 30개월간 저장된다.

 

<Filter>

해당 패키지에 무조건 로그를 찍는 것말고도 필터링이 필요한 경우에 사용하는 기능이다.

하단의 예시 설정 파일에서 사용방법을 확인 하도록 하자. (레벨 필터를 추가해서 level이 error인 것만 찍게 만들었다.)

 

 

ex1) 스프링 프로필 설정 - application.properties

 - 추후 dev, stg, prod 등의 환경을 별도로 선언하기 가능하다.

# 프로필 설정
spring.profiles.active=local

 

ex2) logback-local.properties 파일 생성

 - 간단하게 로그 경로와 파일 이름만 설정 해보도록 하겠다.

#로그파일 경로
log.config.path=/logs/local
#로그파일 이름
log.config.filename=local_log

 

ex3) logback-spring.xml 생성

 - 위에서 설명한 부분도 각각 주석을 추가하였으니 참고 하도록 하자.

<?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="%-5level %d{yy-MM-dd HH:mm:ss}[%thread] [%logger{0}:%line] - %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>

 

 

※ 위의 설정 내용을 캡쳐 화면과 함께 세분화 하여 살펴 보자.

1) Console Appender 설정

    <!-- Console 설정 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%-5level %d{yy-MM-dd HH:mm:ss}[%thread] [%logger{0}:%line] - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- root레벨 설정 -->
    <root level="${LOG_LEVEL}">
        <appender-ref ref="CONSOLE"/>
        <!-- <appender-ref ref="FILE"/> -->
        <!-- <appender-ref ref="Error"/> -->
    </root>

위의 설정을 통해 Console창에 로깅 메세지가 노출되는 것을 볼 수 있다.

 

 

ex) %-5level %d{yy-MM-dd HH:mm:ss}[%thread] [%logger{0}:%line] - %msg%n

=> INFO  20-02-16 16:34:42[http-nio-8080-exec-3] [TestController:41] - INFO Level 테스트

 

2) File Appender 설정

 - logback-local.properties에 설정한 경로와 파일명으로 로그 파일 생성 확인.

<?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>
    <!--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}"/>
    <!-- pattern -->
    <property name="LOG_PATTERN" value="%-5level %d{yy-MM-dd HH:mm:ss}[%thread] [%logger{0}:%line] - %msg%n"/>
    
	<!-- 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>

	<!-- root레벨 설정 -->
	<root level="${LOG_LEVEL}">
		<!-- <appender-ref ref="CONSOLE"/> -->
		<appender-ref ref="FILE"/>
        <!-- <appender-ref ref="Error"/> -->
	</root>
</configuration>

 

 

 

 - local_log.2020-02-14.log 파일은 포스팅 2일 전에 찍어 두었던 로그이다. 일자별로 로그 설정이 되고 있음을 확인할 수 있다.

 

 - 위의 설정부분 중 최대 용량을 10KB로 변경하고 롤링 설정이 올바르게 되었는데 테스트 해보자. (fileNamePattern의 %i가 롤링 순번이며, 최저 최고 순번을 지정할 수 있다.)

 

 

다음 패턴 설정과 동일하게 로그를 끊는 것을 확인할 수 있다.

<fileNamePattern>경로/파일명.yyyy-MM-dd_%롤링순번.log</fileNamePattern>

 

3) filter 설정 확인 (error레벨의 로그만 별도 설정)

<?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>
    <!--Environment 내의 프로퍼티들을 개별적으로 설정할 수도 있다.-->
    <springProperty scope="context" name="LOG_LEVEL" source="logging.level.root"/>
    
    <!-- 필터 사용 예제 -->
	<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>
        
		<!-- root레벨 설정 -->
		<root level="${LOG_LEVEL}">
			<!-- <appender-ref ref="CONSOLE"/> -->
			<!-- <appender-ref ref="FILE"/> -->
			<appender-ref ref="Error"/>
		</root>
	</appender>
<</configuration>

 

 

 파일 생성

 

 

 

파일 내용

 

 

 - 에러 레벨의 로그내용만 따로 로그 파일로 저장할 수 있는 것을 볼 수 있다.

 

4) root, logger를 통해 전체 로깅 레벨과 특정 패키지의 로깅 레벨을 별도로 설정 가능 하다.

    <!-- 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>

 

 

간단히 로깅 설정 Sample을 통해 logback 설정에 대해 알아 보았다.

기본 logback 은 스프링 부트에 포함되어 있으나, jdbc에 대한 logback 설정은 되어 있지 않기 때문에 이 부분은 다음 포스팅에서 추가로 설정해볼 예정이다.