[스프링 핵심원리 - 고급편 ] 로그추적기 v2 - 파라미터로 동기화 개발

JEONG SUJIN·2023년 2월 11일
0

스프링부트 기본

목록 보기
9/15

트랜잭션ID와 메서드 호출의 깊이를 표현하는 가장 단순화 방법은 첫 로그에서 사용한
트랜잭션IDlevel을 다음 로그에 남겨주면 된다.

현재 로그의 상태정보인 트랜잭션IDlevelTraceId에 포함되어있다.
TraceId를 다음 로그에 넘겨주면 된다.

이기능을 추가한 HelloTrace2를 개발해보자!

HelloTraceV2

//v2에서 추가
	public TraceStatus beginSync(TraceId beforeTraceId, String message) {
		TraceId nextId= beforeTraceId.createNextId();
		
		Long startTimeMs = System.currentTimeMillis();
		log.info("[{}] {} {} ", nextId.getId(), addSpace(START_PREFIX, nextId.getLevel()), message);
		//로그출력
		return new TraceStatus(nextId, startTimeMs, message);
	};

파라미터에 TraceId beforeTraceId를 추가하고,
아이디를 TraceId nextId= beforeTraceId.createNextId()로 변경한다.

HelloTraceV2 는 기존 코드인 HelloTraceV1와 같고, beginSync(..)가 추가되었다.

beginSync

  • 기존 TraceId 에서 createNextId를 통해서 다음 ID를 구한다.
  • createNextId()의 TraceId 생성 로직은 다음과 같다.
    • 트랜잭션 ID는 기존과 같이 유지된다.
    • 깊이를 표현하는 Level은 하나 증가한다. ( 0 -> 1)

HelloTraceV1Test2.java 테스트 코드 확인 해보기

package study.advanced.trace.hellotrace;
import org.junit.jupiter.api.Test;
import study.advanced.trace.TraceStatus;
public class HelloTraceV1Test2 {

	@Test
	void begin_end() {
		HelloTraceV2 trace = new HelloTraceV2();
		TraceStatus status1 = trace.begin("hello1");
		TraceStatus status2 = trace.beginSync(status1.getTraceId(), "hello2");
		trace.end(status2); 
		trace.end(status1);
	}
	
	@Test
	void begin_exception() {
		HelloTraceV2 trace = new HelloTraceV2();	
		TraceStatus status1 = trace.begin("hello1");
		TraceStatus status2 = trace.beginSync(status1.getTraceId(), "hello2");
		trace.exception(status2, new IllegalStateException());
		trace.exception(status1, new IllegalStateException());
	}
}

처음에는 begin(..) 을 사용하고 이후에는 beginSync(..)를 사용하면 된다. beginSync(..)를 호출할 때 직전 로그의 traceId정보를 넘겨주어야 한다.

실행로그를 보면 트랜잭션ID를 유지하고 level을 통해 메서드 호출의 깊이를 표현하는 것을 확인할 수 있다.

profile
기록하기

0개의 댓글