전문
@Slf4j
@Component
public class HelloTraceV2 {
private static final String START_PREFIX = "-->";
private static final String COMPLETE_PREFIX = "<--";
private static final String EX_PREFIX = "<X-";
public TraceStatus begin(String message){
TraceId traceId = new TraceId();
Long startTimeMs = System.currentTimeMillis();
log.info("[{}] {}{}", traceId.getId(), addSpace(START_PREFIX, traceId.getLevel()), message);
return new TraceStatus(traceId, startTimeMs, message);
}
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);
}
public void end(TraceStatus status){
complete(status, null);
}
public void exception(TraceStatus status, Exception e){
complete(status, e);
}
private void complete(TraceStatus status, Exception e){
Long stopTimeMs = System.currentTimeMillis();
long resultTimeMs = stopTimeMs - status.getStartTimeMs();
TraceId traceId = status.getTraceId();
if(e == null){
log.info("[{}] {}{} time={}ms", traceId.getId(), addSpace(COMPLETE_PREFIX, traceId.getLevel()), status.getMessage(), resultTimeMs);
}else{
log.info("[{}] {}{} time={}ms ex={}", traceId.getId(), addSpace(EX_PREFIX, traceId.getLevel()), status.getMessage(), resultTimeMs, e.toString());
}
}
private static String addSpace(String prefix, int level){
StringBuilder sb = new StringBuilder();
for(int i = 0; i< level; i++){
sb.append((i==level - 1) ? "|" + prefix : "| ");
}
return sb.toString();
}
}
추가된 건,
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);
}
이 부분.
createNextId로 레벨을 올린다.
public TraceId createNextId(){
return new TraceId(id, level + 1);
}
테스트
@Test
void begin_end(){
HelloTraceV2 trace = new HelloTraceV2();
TraceStatus status1 = trace.begin("hello");
TraceStatus status2 = trace.beginSync(status1.getTraceId(), "hello2");
trace.end(status2);
trace.end(status1);
}
일일히 인자로 넣어줘야 하는게 불편하긴 함.
대충 컨트롤러 빼고 다 status 인자로 준 다음에,
그 인자로 받은 메소드 측에서 beginSync 할 듯
'스프링 > 스프링 핵심 원리 - 고급편' 카테고리의 다른 글
8. V2 정리 (0) | 2024.01.14 |
---|---|
7. V2 적용 (0) | 2024.01.14 |
5. 로그 추적기 적용 (0) | 2024.01.14 |
4. 로그추적기 V1 프로토타입 (0) | 2024.01.05 |
3. 요구사항 분석 (0) | 2024.01.05 |