로그 추적기

다음 요구사항을 만족하는 로그 추적기를 만들어보자.

  • 모든 Public 메서드의 호출과 응답 정보를 로그로 출력한다.

  • 애플리케이션의 흐름을 변경하면 안 된다.

    • 로그를 남긴다고 해서 비즈니스 로직의 동작에 영향을 주면 안 된다.

  • 메서드 호출에 걸린 시간

  • 정상 흐름과 예외 흐름 구분

    • 예외 발생 시 예외 정보가 남아야 한다.

  • 메서드 호출의 깊이 표현

  • HTTP 요청 구분

    • HTTP 요청 단위로 특정 ID를 남겨서 어떤 HTTP 요청에서 시작된 것인지 명확하게 구분히 가능해야 한다.

로그 추적기를 위한 기반 데이터를 가지고 있는 클래스

/**
 * 트랜잭션 ID와 깊이를 갖는 클래스
 */
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)//외부에서 직접 생성할 일이 없다.
public class TraceId {

    private String id;
    private int level;

    //생성 시점에 트랜잭션 ID와 레벨 초기화
    public TraceId() {
        id = createId();
        level = 0;
    }

    private String createId() {
        //앞 8자리만 사용
        return UUID.randomUUID().toString().substring(0, 8);
    }

    //트랜잭션 ID는 그대로, 깊이를 증가한다.
    public TraceId createNextId() {
        return new TraceId(id, level + 1);
    }

    //트랜잭션 ID는 그대로, 깊이를 감소한다.
    public TraceId createPreviousId() {
        return new TraceId(id, level - 1);
    }

    //첫 번째 레벨 여부를 확인한다.
    public boolean isFirstLevel() {
        return level == 0;
    }
}

/**
 * 로그를 시작할 때의 상태 정보를 갖는 클래스
 */
@AllArgsConstructor
@Getter
public class TraceStatus {
    private TraceId traceId;//트랜잭션 ID와 레벨을 갖고 있다.
    private Long startTimeMs;//로그 시작 시간, 이 시간을 기준으로 전체 수행 시간을 구할 수 있다.
    private String message;//시작 시 사용한 메시지, 로그 종료까지 이 메시지를 사용해서 출력해야 한다.
}

전체 내용에 대한 출처 : 인프런 - 김영한 님의 "스프링 핵심 원리 - 고급편"

Last updated