Free Lines Arrow
본문 바로가기
개발관련지식/스터디한내용

Log 수집기능 개발하기

by skahn1215 2023. 5. 27.
728x90
반응형

Log 수집기능 개발하기

  • 로그 수집을 위한 기능을 구현할 것이다.
  • 굳이 글로 적는 이유는 AOP 방식이 아닌 EventHandler 로 구현을 할 예정이기 때문이다.

 

Log 수집기능 개발 구조

  • App 에서 카프카로 데이터를 보내주면
  • 카프카에서 필요한 데이터 들을 다른 곳에서 sub 할수 있게 구현을 할것이다.

 

Log 수집기능 고려사항

  • 기존 서비스 응답시간에 영향을 미치면 안된다.
  • 기존 코드 수정을 최소화 한다.
  • 다양한 로그 형태를 수집 할 수 있어야 한다.
  • 서비스 마다 retun 값이 다르다.
  • 트랜잭션이 있는경우 트랜잭션을 유지 해야 한다.

 

Log 수집기능 구현방식 선택

  • AOP, EventListener 둘중 하나를 고민했다.
  • 메소드마다 트랜잭션, 리턴값이 다르다는것, 메소드 마다 파라미터 값이 다르다는것을
    고려 했을때 EventLisetner 로 구현 하는것을 선택했다.

 

EventListener

  • 이벤트를 통해 다른 서비스와 연동
  • 서비스간 결합을 줄일 수 있다.
  • PUB, SUB 개념으로 이해하면 쉬울것 같다.

 

@Async + @TransactionalEventListener 선택

  • 트랜잭션을 고려 하여  TransactionEventListener 를 선택했다.
  • 기존 응답시간에 영향을 미치지 않기 위해 @Asnyc 를 사용한다.

 

TransactionalEventListener 동작 값

  • AFTER_COMMIT (기본값) - 트랜잭션이 성공적으로 마무리(commit)된 경우 이벤트 실행
    • 중간에 롤백이나 익셉션이 발생하면 이벤트 수행 안함.
  • AFTER_ROLLBACK – 트랜잭션이 rollback 됬을 때 이벤트 실행
  • AFTER_COMPLETION – 트랜잭션이 마무리 됐을때(commit or rollback 관련없이) 이벤트 실행
    • 무조건 수행
  • BEFORE_COMMIT - 트랜잭션의 커밋 전에 이벤트 실행

 

아래코드는 회사에서 사용자 행동 패턴 분석 하기위한 내가 만든 코드이다.

@Component
@sl4j
@RequiredArgsConstruct
public class UserLogEventHandler {
    private final UserActionLogCollectService service;

    @Async
    @TranSactionEventListener
    public void processTransactionEvent(UserLogTransactionEvent event) {
        try {
            UserLogRequestDTO userLogRequestDto = service.createUserActionLog(event.getCreator());
            service.sendUserActionLogToKafka(userLogRequestDto);
        } catch(ApiException) {
             log.error("Fail to collecting log: {}", e.getMessage());
        }
    }

    @Async
    public void processEvent(UserLogEvent event) {
        try {
            UserLogRequestDTO userLogRequestDto = service.createUserActionLog(event.getCreator());
            service.sendUserActionLogToKafka(userLogRequestDto);
        } catch(ApiException) {
             log.error("Fail to collecting log: {}, e.getMessage());
        }
    }
}

 

 

Log Creator class

  • 다양한 로그를 쌓기 위해 아래처럼 클래스 를 설계를 했다.
  • 공통 값들은 BaseLog에 넣고 
  • 각각 다양한 로그를 하나로 묶어 다형성을 가지게 하기 위함이다.
  • 그렇게 하면 위에 이벤트를 처리 할때 BaseLog 로 선언해 주고
    로그 DTO 를 생성하는 코드는 자식 클래스에서 담당하게 한다.

 

결론

이번 내용은 불친절하다고 생각한다 그이유는 일일이 코드를 올리는것이 불필요하다 생각이 들었다.

자세한 코드는 깃허브에 구현을 해둘 예정이다.

728x90
반응형

'개발관련지식 > 스터디한내용' 카테고리의 다른 글

[개발지식] SPF, DKIM  (0) 2022.01.15

댓글