SLF4J(Simple Logging Facade for Java)는 자바 애플리케이션을 위한 로깅 프레임워크입니다.
여러 로깅 프레임워크에 대한 추상화 계층을 제공하여, 개발자가 특정 로깅 구현체에 종속되지 않고 유연하게 로깅 기능을 사용할 수 있게 해줍니다.
그중에서도 Logback에서 제공하는 MDC에 대해 자세히 알아보겠습니다.
우리는 로그를 통해 사용자의 요청을 추적하고 디버깅합니다.
만약, 수많은 동시 요청이 발생하는 환경에서는 각 요청에 대한 로그를 추적하고 구분하는 것이 어려울 수 있습니다.
때문에 이러한 문제를 해결하기 위해 Logback의 MDC를 활용할 수 있습니다.
MDC란?
SLF4J에서 제공하는 기능으로, 스레드별로 고유한 컨텍스트 정보를 저장하고 관리할 수 있게 해줍니다.
이를 통해 로그 메시지에 추가적인 컨텍스트 정보를 포함시킬 수 있어, 각 요청을 쉽게 구분하고 추적할 수 있습니다.
MDC의 주요 특징
- MDC는 ThreadLocal을 기반으로 구현되어 있어, 멀티스레드 환경에서도 안전하게 사용할 수 있습니다.
- 문자열 키와 값의 쌍으로 데이터를 저장합니다.
- 로그 계층 구조에서 하위 로거들이 상위 로거의 MDC 정보를 상속받아 사용할 수 있습니다.
MDC의 활용하기
모든 요청, 응답, 에러, 메서드 시작 전 등등 로그를 찍기 위해 filter, Interceptor, aop 중 어떤 방식을 통해 구현할지를 선택할 수 있습니다.
저는 그중에서도 MDC를 통한 추척은 filter를 사용하여 구현했는데요. 그 이유는 다음과 같았습니다.
- Filter는 요청 처리의 가장 앞단에서 동작한다.
- 요청의 시작부터 응답의 끝까지 전체 생명주기를 커버할 수 있다.
처음 제가 MDC를 사용하려는 목적이 요청의 시작부터, 처리되는 과정, 응답까지를 추적하기 위한 것이었기 때문에 filter를 사용하기로 했습니다.
MDC 사용 코드
@Slf4j
@Component
public class MDCFilter implements Filter {
private final String CORRELATION_ID = "correlationId";
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
MDC.put(CORRELATION_ID, generateCorrelationId());
chain.doFilter(request, response);
MDC.clear();
}
private String generateCorrelationId() {
return UUID.randomUUID()
.toString()
.substring(0, 8);
}
}
MDC 사용
서로 다른 식별값을 가지고 있는 것을 확인할 수 있습니다.
'우아한테크코스 6기 > 3단계' 카테고리의 다른 글
Loki, Promtail, Grafana를 사용한 로그 모니터링 구축 (0) | 2024.08.13 |
---|---|
우아한 스키마 관리를 위한 flyway 도입 (3) | 2024.08.13 |
NoResourceFoundException 에 대해 알아보자 (0) | 2024.08.11 |
팀 로깅 전략 구상기 (0) | 2024.08.05 |
Intellij Debugger, 어디까지 알고 사용하고 있나요? - 신기한 기능편 (2) | 2024.07.20 |