반응형
오늘 로그 추적기를 만들었다.
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로 닫으면서 로그를 찍고 마무리한다.
반응형
'Framework & Library > Spring Boot' 카테고리의 다른 글
[Spring Boot] : 파일 업로드, 파일 다운로드 구현하기 (0) | 2022.03.18 |
---|---|
[Spring Boot] : 스프링과 파일 업로드 (0) | 2022.03.17 |
[Spring Boot] : 서블릿과 파일 업로드(2) (0) | 2022.03.17 |
[Spring Boot] : 서블릿과 파일 업로드(1) (0) | 2022.03.17 |
[Spring Boot] : Spring이 제공하는 기본 포맷터 (0) | 2022.03.16 |
댓글