본문 바로가기
Framework & Library/Spring Boot

[Spring Boot] : 로그 추적기

by 오주현 2022. 6. 22.
반응형

오늘 로그 추적기를 만들었다. 

 

private String id;
private int level;

TraceId 클래스에 여러 생성자를 만들어 주었다.

 

public TraceId(String id, int level) {
    this.id = id;
    this.level = level;
}

public TraceId() {
    this.id = createId();
    this.level = 0;
}

public String getId() {
    return id;
}

public int getLevel() {
    return level;
}

TraceId를 creat할 수 있는 생성자들이다.

 

@Getter
public class TraceStatus {

    private TraceId traceId;
    private Long startTimeMs;
    private String message;

    public TraceStatus(TraceId traceId, Long startTimeMs, String message) {
        this.traceId = traceId;
        this.startTimeMs = startTimeMs;
        this.message = message;
    }
}

TraceStatus에서는 TraceId와 시작 시간과 메시지를 찍어준다.

 

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);
}

// 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);
}

begin은 Controller 시작 때 사용하고, beginSync는 서비스나 레포지토리 끝에 사용한다. 

 

    private final HelloTraceV2 trace;

    @GetMapping("/v2/request")
    private String request(String itemId) {

        TraceStatus status = null;
        try{
            status = trace.begin("OrderController.request()");
            orderService.orderItem(status.getTraceId(), itemId);
            trace.end(status);
            return"ok";
        } catch (Exception e) {
            trace.exception(status, e);
            throw e; // 예외를 받고 먹으면 안되니 던져준다.
        }
    }

컨트롤러에서 의존성을 주입하고 파라미터로 traceId와 메시지를 넣어 서비스로 보내준다.

 

public void orderItem(TraceId traceId, String itemId) {

    TraceStatus status = null;
    try{
        status = trace.beginSync(traceId,"OrderService.request()");
        orderRepository.save(status.getTraceId(), itemId);
        trace.end(status);
    } catch (Exception e) {
        trace.exception(status, e);
        throw e; // 예외를 받고 먹으면 안되니 던져준다.
    }
}

서비스에서 받고 똑같이 레포로 넘겨주면서 로그를 찍는다. 레포를 찍고 돌아올 때는 end로 닫으면서 로그를 찍고 마무리한다.

반응형

댓글