inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 고급편

실행시간에 따른 log 레벨 적용

374

이윤구

작성한 질문수 0

1

강사님께서 말씀주신 실행시간에 따른 log 레벨 달리하는 부분 적용 해보았습니다.  필요하신 분 있으면 참고해 주세요. 

(오류 발생 시에만 로그 남기는 부분은 @AfterThrowing 어드바이스를 사용하면 될거 같습니다 - Retry에서는 재시도 제거)

피드백 사항 있으면 말씀 부탁합니다. ^^;

1. 어노테이션 - 기본값 1000

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckTime {
int value() default 1000;
}

2. Aspect

@Around("@annotation(checkTime)")
public void checkTimer(ProceedingJoinPoint joinPoint, CheckTime checkTime) throws Throwable {

int mills = checkTime.value();

StopWatch stopWatch = new StopWatch();

stopWatch.start();
joinPoint.proceed();
stopWatch.stop();

long totalTimeMillis = stopWatch.getTotalTimeMillis();

Signature signature = joinPoint.getSignature();
String methodName = signature.getName();

if (totalTimeMillis <= mills) {
log.info("methodName: {}, 실행시간 = {}ms", methodName, totalTimeMillis);
}else if (totalTimeMillis > mills) {
log.error("methodName: {}, 실행시간 = {}ms", methodName, totalTimeMillis);
}
}

3. repository 레이어- 랜덤으로 실행시간 적용

@CheckTime(value = 2000)
public String save(String itemId) {
seq++;
if (seq % 5 == 0) {
throw new IllegalStateException("예외 발생");
}
sleep();
return "ok";
}

private void sleep() {
int[] ints = {1000, 2000,3000,4000,5000};

double random= Math.random();
int num = (int) Math.round(random * (ints.length-1));

try {
Thread.sleep(ints[num]);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

영한님 항상 감사합니다!!

답변 0