본문 바로가기

Tech/Spring | SpringBoot

[SpringBoot] Logging - 2 (Logback)

반응형

1. Logback

Logback 은 자바 로깅 프레임워크 중 하나로 Spring boot 에서 기본 로깅 모듈로 사용하고 있는 모듈이다.

Spring boot 에서 dependency 를 설정할 때 spring-boot-starter-web 패키지를 설정하는데, 해당 패키지에 Logback 이 포함되어 있다.

 

Logback 은 일반적으로 logback.xml 파일을 통해 설정하는데, Spring boot 환경에서는 logback-spring.xml 파일을 통해서 Logback 을 설정한다.

 

Logback 의 설정으로는 로그를 출력하는 방식 (콘솔, 파일, 네트워크 통신 등등), Spring Profile 별 로그 설정, 로그 레벨, 로그 형식 등등의 기능을 설정할 수 있다.

2. Logback 설정

- build.gradle dependency 설정

Spring boot 에서 Logback 을 사용하기 위해서 Logback 을 포함하고 있는 패키지를 사용하도록 지정해주어야 한다.

build.gradle 에서 spring-boot-starter-web 을 dependency 에 추가해주면 된다.

 

implementation 'org.springframework.boot:spring-boot-starter-web'

- logback-spring.xml

logback 모듈을 설정하기 위한 logback-spring.xml 파일은 src/main/resources 디렉토리에 위치한다.

logback-spring.xml 의 예제는 다음과 같다.

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- include: 다른 logback 설정 파일을 읽어온다. 읽어 온 설정 파일들의 appender 나 property 등을 사용할 수 있다. 여기서 include 한 파일들은 logback 패키지에 기본적으로 존재하는 파일들이다. -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>

	<!-- property: 설정 파일 내부에서 사용할 속성을 정의한다. -->
    <property name="LOG_PATH" value="./logs" />
    
    <!-- appender: logback 이 logging event 를 발행하도록 위임하는 객체이다. -->
    <!-- RollingFileAppender: FileAppender 를 상속받아서 기본적으로 파일에 로깅하는 Appender 이다. 파일에 로깅을 하다가 특정 조건이 되면 로그를 쌓던 파일을 다음 파일로 변경하는데, 이를 rollover 라고 한다. -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- ${...}: 해당 기호 안의 이름과 동일한 property 의 값을 사용한다. ${LOG_PATH} 는 "./logs" 값을 가진다. -->
        <!-- file: 로그를 남길 파일의 설정한다. -->
        <file>${LOG_PATH}/logback.log</file>
    
    	<!-- encoder: 로그의 형식을 설정한다. -->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        
        <!-- rollingPolicy: rollover 정책을 설정한다. TimeBasedRollingPolicy 는 이름대로 시간 조건을 이용해 rollover 를 관리한다. -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- fileNamePattern: rollover 된 파일의 이름 형식을 정의한다. logback.log 가 rollover 되면 해당 형식으로 파일 이름이 변경된다. -->
            <fileNamePattern>${LOG_PATH}/logback.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
        
        	<!-- timeBasedFileNamingAndTriggeringPolicy: TimeBasedRollingPolicy 의 trigger 정책을 설정한다. -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- maxFileSize: 로그 파일의 최대 크기를 설정한다. -->
                <maxFileSize>5MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            
            <!-- maxHistory: 최대로 보관하는 파일의 개수를 설정한다. -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

	<!-- root: logback 의 레벨을 설정한다. logback 의 레벨은 'TRACE, DEBUG, INFO, WARN, ERROR' 로 구성되어 있다. -->
    <root level="INFO">
        <!-- appender-ref: ref 의 값 (여기서는 FILE) 을 이름으로 가지는 appender 를 사용한다. -->
        <appender-ref ref="FILE" />
    </root>
    
    <!-- springProfile: 해당 Profile 에서의 로그 생성 전략을 설정한다. -->
    <!-- local profile 의 설정 -->
    <springProfile name="local">
        <include resource="org/springframework/boot/logging/logback/base.xml" />
    </springProfile>
    
    <!-- dev profile 의 설정 -->
    <springProfile name="dev">
        <property name="LOG_PATH" value="/home/application/logs" />
       
        <root level="DEBUG">
            <appender-ref ref="FILE" />
            <appender-ref ref="CONSOLE"/>
        </root>
    </springProfile>
    
    <!-- prod profile 의 설정 -->
    <springProfile name="prod">
        <property name="LOG_PATH" value="/home/application/logs" />
        <root level="INFO">
            <appender-ref ref="FILE" />
        </root>
    </springProfile>
</configuration>

include

include 태그는 다른 logback 설정 xml 파일을 참조하는 태그이다. include 태그로 xml 파일을 참조하면 참조된 파일에 정의된 property 나 appender 등을 사용할 수 있다.

 

위 예제에서는 defaults.xml 과 console-appender.xml, local profile 에서는 base.xml 등을 include 하고 있는데, 이들은 모두 logback 패키지에서 기본적으로 제공하는 설정 파일들이다. logback 패키지에는 base.xml, defaults.xml, console-appender.xml, file-appender.xml 을 포함하고 있다.

property

xml 파일에서 사용할 속성을 정의하는 태그이다. 변수를 정의하는 것과 같이 name 에 속성 이름을 입력하고 value 에 속성의 값을 입력하여 정의한다. 설정 파일 안에서 ${name} 의 형식으로 정의된 속성의 value 를 사용할 수 있다.

appender

appender 태그는 Appender 객체를 정의하는 태그이다. logback 은 정의된 Appender 를 통해서 logging 을 수행한다.

 

Appender 의 구현 클래스로는 ConsoleAppender 와 FileAppender 가 있는데, 이들은 각각 console 과 file 에 로그를 남기도록 하는 appender 들이다. 이들은 Encoder 필드를 통해서 로그를 어떤 형식으로 남길지 결정할 수 있다.

 

이 예제에서는 RollingFileAppender 를 사용하는데, 이 Appender 는 FileAppender 를 상속받은 Appender 클래스이다. 이 클래스는 기본적으로 파일에 로그를 남기다가 특정 조건이 되면 새로운 파일을 생성하여 로그를 남기도록 한다. 이를 rollover 라고 하는데 RollingFileAppender 는 rollover 를 어떻게 실행할지를 정의하는 RollingPolicy 와 언제 rollover 를 실행할 것인지 설정하는 TriggeringPolicy 를 주요 기능으로 로깅을 수행한다.

 

appender 의 내부 설정은 예제의 태그와 주석을 참고하면 된다.

root

root 태그는 logger 의 최상단 속성으로 로깅 레벨과 사용할 appender 등을 정의한다. logback 은 root 태그의 설정을 기반으로 로깅을 수행한다.

 

root 태그는 단 하나의 레벨만 가질 수 있으며, springProfile 이나 logger 태그 등을 통해서 root 를 오버라이드 할 수 있다. 해당 태그들로 지정한 환경에서는 오버라이드 된 root 의 설정으로 로깅된다.

 

사용할 appender 는 root 태그 하위에서 appender-ref 태그를 통해서 지정한다.

springProfile

springProfile 태그는 spring application 의 Profile 별로 로그 생성 전략을 다르게 설정할 수 있는 태그이다.\

 

※ Spring Profile

 

Spring Profile 은 application 이 실행되는 환경에 따라서 다른 설정을 적용하기 위해서 사용한다. local, dev, production 등 application 이 개발, 테스트, 운영되는 환경에 따라 다른 설정으로 실행되야 할 때 사용한다.

 

Spring boot 에서는 application.properties 에서 spring.profiles.active 를 통해서 현재 실행되는 application 의 환경을 지정할 수 있다.

 

# spring.profiles.active=local
spring.profiles.active=dev
# spring.profiles.active=prod

3. logger 사용

로깅을 하기 위해서는 logger 를 객체를 생성해야 한다. LoggerFactory 를 사용해서 logger 를 얻고, 생성된 logger 객체를 사용해 log 를 남긴다.

 

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Test {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    public void logging(String msg) {
        logger.trace(msg);
        logger.debug(msg);
        logger.info(msg);
        logger.warn(msg);
        logger.error(msg);
    }
}

 

Logger 객체는 각 로그 레벨과 동일한 이름의 메서드 들을 가지고 있다. 이 메서드들은 각 이름에 매칭되는 레벨의 로그를 남긴다.

[Reference]

- https://wbluke.tistory.com/51

 

Logback으로 로그 관리하기

Logback 안녕하세요~ 이번 포스팅에서는 Logback의 구조와 사용 방법에 대해서 정리해보려고 합니다. 모든 내용을 다 다룰 수는 없지만, 기본적인 구조를 인지하고 있으면 나머지는 필요할 때마다

wbluke.tistory.com

- https://tecoble.techcourse.co.kr/post/2021-08-07-logback-tutorial/

 

Logback 으로 쉽고 편리하게 로그 관리를 해볼까요? ⚙️

Spring Boot…

tecoble.techcourse.co.kr

- https://howtodoinjava.com/spring-boot2/logging/profile-specific-logging/

 

Spring boot profile specific logging example

Spring boot provides support for separate logging configurations for separate runtime environments/profiles. Spring profile specific logging with logback.

howtodoinjava.com

 

반응형