티스토리 뷰
MDC(Mapped Diagnostic Context)
멀티 클라이언트 환경에서 다른 클라이언트와 값을 구별하여 로그를 추적할 수 있도록 제공되는 map이다.
ThreadLocal에 구별할 수 있는 키 값을 저장하여 Thread가 존재하는 동안 계속해서 사용할 수 있도록 하는 방법으로
현재 log4j 및 logback만 MDC기능을 제공하고 있다.
애플리케이션에서 MDC 사용하기
springboot 2.1.1 , jdk 1.8
1. 의존성 주입
springboot 환경에서는 spring-boot-starter-web을 의존성으로 추가하면 logback이 기본으로 포함되어 있다.
maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
}
2. 사용법
1) java code
java.util.Map 과 사용법이 같다.
put | 현재의 쓰레드 컨텍스트 맵에 key로 식별되는 value를 저장한다. |
get | key로 value를 식별하여 컨텍스트에서 꺼내온다. |
remove | key로 식별되는 value를 컨텍스트에서 제거한다. |
clear | MDC의 모든 항목을 지운다. |
2) logback
Pattern에 MDC.put에 넣은 키 값을 아래와 같은 형식으로 적어주면 된다.
%X{key}
3. 애플리케이션 적용
1) java code
인터셉터를 만들어서 컨트롤러에 진입하기 전에 traceId를 MDC안에 put하고
비즈니스 로직을 수행한 뒤 인터셉터를 나갈 때 MDC를 clear 하였다.
2) logback
인터셉터에서 사용한 key값 traceId를 logback pattern에 추가
4. 로그
MDC.put 이후 traceId 로그에 출력
MDC.clear 이후 traceId 제거
적용 후기
로그를 추적할 때 하드코딩으로 남기는 키 값과 쓰레드 번호를 기준으로 로그를 쉽게 찾는 경우가 있다. 그러나 트래픽이 많고 별도 쓰레드를 만들어서 요청 건을 가져오는 경우에는 쓰레드 번호가 중복되어 로그를 찾기 어려운 점이 있고, 하나하나 하드코딩으로 특정 키 값을 로그에 남기기에는 꽤 공수가 든다. 위와 같은 문제들로 인해 회사의 레거시 프로젝트에서 로그를 추적하기 어려운 부분이 있어서 MDC를 적용하여 로그 추적의 효율성을 높인 적이 있다. 만약 진행하고 있는 프로젝트가 spring cloud를 도입하기에 어렵지 않은 구조라면 Spring Cloud Sleuth를 이용하면 더 쉽게 로그를 추적할 수 있고 Zipkin과 연동하여 다양한 기능을 사용할 수 있다.
참고
logback.qos.ch/manual/mdc.html
egloos.zum.com/charmpa/v/2543451
'jvm언어관련 > java' 카테고리의 다른 글
javax.imageio.IIOException: Unsupported Image Type (0) | 2019.12.27 |
---|---|
JVM 이해하기 (0) | 2019.09.18 |
java.lang.UnsupportedClassVersionError (0) | 2019.09.17 |
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure (0) | 2019.07.23 |
@NotEmpty @NotNull @NotBlank (0) | 2019.06.12 |
- Total
- Today
- Yesterday
- 다중 업데이트
- 몽고DB 완벽가이드
- update query set multiple
- update query multi row
- visual studio code
- 슬랙봇
- java
- vue.js
- 뱅크샐러드
- springboot https
- update query mutiple row
- update set multi
- update set multiple
- 뱅셀 유전자
- 싱글턴
- effectivejava
- 그레이들
- MSSQL
- Slack
- 뱅크샐러드 유전자
- 이펙티브자바
- 업데이트 쿼리
- 슬랙
- spring-boot-starter-data-redis
- 슬랙 /
- 이것이 자바다
- SpringBoot
- multiple row update
- update query
- gradle
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |