로그 추적기
다음 요구사항을 만족하는 로그 추적기를 만들어보자.
모든 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