공부 내용을 정리하고 앞으로의 학습에 이해를 돕기 위해 작성합니다.
이번 시간에는 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 설정 방법을 알아보았다.
'BackEnd > Project' 카테고리의 다른 글
[RealPJ] Ch02. Log를 관리하기 위한 Logback 설정(5) (0) | 2024.08.31 |
---|---|
[RealPJ] Ch02. Log를 관리하기 위한 Logback 설정(4) (0) | 2024.08.31 |
[RealPJ] Ch02. Log를 관리하기 위한 Logback 설정(2) (1) | 2024.08.31 |
[RealPJ] Ch02. Log를 관리하기 위한 Logback 설정 (0) | 2024.08.31 |
[RealPJ] Ch02. 실무 스타일로 Feign Client 사용해보기 - ErrorDecoder (0) | 2024.08.31 |