본문 바로가기
BackEnd/Project

[RealPJ] Ch02. Log를 관리하기 위한 Logback 설정(3)

by 개발 Blog 2024. 8. 31.

공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.

이번 시간에는 MDC라는 개념과 MDC를 활용하여 Logback에서 어떻게 로그를 남길 수 있는지에 대해 알아본다.

 

1. MDC란 무엇인가?

MDC는 Mapped Diagnostic Context의 약자로, 멀티스레드 환경에서 로그를 남길 때 사용하는 개념이다. 쉽게 말해, 멀티스레드 환경에서 스레드마다 고유한 로그 값을 갖고 이를 Logback에 전달하기 위해 사용된다. 이를 통해 각 스레드에서 발생한 로그를 구분할 수 있다. MDC는 @Slf4j 패키지 안에 포함되어 있으며, key-value 형태로 선언되어 특정 값을 저장하고, 해당 값을 로그에 포함시킬 수 있다.

 

2. 컨트롤러 생성 및 MDC 적용

다음으로, 간단한 컨트롤러를 생성하여 MDC를 사용한 로그 출력을 테스트해 본다.

package dev.be.logback.controller;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class MdcController {

    @GetMapping("/mdc")
    public String mdc() {
        MDC.put("job", "dev");

        log.trace("log -> TRACE");
        log.debug("log -> DEBUG");
        log.info("log -> INFO");
        log.warn("log -> WARN");
        log.error("log -> ERROR");
        
        MDC.clear();
        
        return "mdc";
    }
}

 

3. Logback 설정 파일에 MDC 적용

이제 logback-spring-prod.xml 파일에 MDC를 적용한 설정을 추가한다.

 

logback-spring-prod.xml

<included>
    <property resource="logback-variables.properties"/> <!-- logback-variables.properties 사용-->

    <appender name="REQUEST1" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/request1.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/archive/request1.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <maxFileSize>1KB</maxFileSize> <!--로그 파일의 최대 크기 -->
            <maxHistory>30</maxHistory>  <!-- 로그 파일 최대 보관 주기 (단위 : 일) -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                [REQUEST1] ${LOG_PATTERN}
            </pattern>
            <outputPatternAsHeader>true</outputPatternAsHeader>
        </encoder>
    </appender>

    <appender name="REQUEST2" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/request2.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/archive/request2.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <maxFileSize>10KB</maxFileSize> <!--로그 파일의 최대 크기 -->
            <maxHistory>30</maxHistory>  <!-- 로그 파일 최대 보관 주기 (단위 : 일) -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                [REQUEST2] ${LOG_PATTERN}
            </pattern>
            <outputPatternAsHeader>true</outputPatternAsHeader>
        </encoder>
    </appender>

    <appender name="MDC" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/mdc.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/archive/mdc.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <maxFileSize>10KB</maxFileSize> <!--로그 파일의 최대 크기 -->
            <maxHistory>30</maxHistory>  <!-- 로그 파일 최대 보관 주기 (단위 : 일) -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                [MDC] %X{job}%n
            </pattern>
            <outputPatternAsHeader>true</outputPatternAsHeader>
        </encoder>
    </appender>

    <root level="INFO">
<!--        <appender-ref ref="REQUEST1"/>-->
<!--        <appender-ref ref="REQUEST2"/>-->
        <appender-ref ref="MDC"/>

    </root>

</included>
  • 이 설정은 MDC에서 job이라는 키로 저장된 값을 로그에 출력하도록 설정한다. 또한, 로그 파일을 mdc.log라는 파일에 기록하고, 파일이 10KB를 초과할 경우 자동으로 분할하여 저장한다.

4. 서버 실행 및 로그 확인

서버를 실행하고 /mdc 엔드포인트에 요청을 보내면, 설정된 대로 mdc.log 파일에 로그가 기록된다. 로그 파일에는 [MDC] 접두사와 함께, job 키로 저장된 값인 dev가 포함된다.

 

5. 결론

MDC를 활용하면 멀티스레드 환경에서 각 스레드마다 고유한 로그를 남길 수 있으며, 이를 통해 로그의 가독성과 관리 효율성을 높일 수 있다. 이번 실습에서는 간단한 예제를 통해 MDC를 적용한 Logback 설정 방법을 알아보았다.