트랜잭션ID와 메서드 호출의 깊이를 표현하는 가장 단순화 방법은 첫 로그에서 사용한
트랜잭션ID
와 level
을 다음 로그에 남겨주면 된다.
현재 로그의 상태정보인 트랜잭션ID
와 level
은 TraceId
에 포함되어있다.
TraceId
를 다음 로그에 넘겨주면 된다.
이기능을 추가한 HelloTrace2를 개발해보자!
//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(..)
가 추가되었다.
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을 통해 메서드 호출의 깊이를 표현하는 것을 확인할 수 있다.