로그와 메트릭을 설명해주세요.

백엔드와 관련된 질문이에요.

로그는 서버가 동작할 때 서버의 상태와 동작 정보를 시간 경과에 따라 기록된 결과입니다. 로그는 시스템의 오류와 문제들을 쉽게 찾아낼 수 있도록 도와줍니다. 반면, 메트릭은 시스템의 성능과 상태에 대한 통계적인 정보를 의미합니다. 메트릭을 잘 수집하면 시스템의 현재 상태를 손쉽게 파악할 수 있고, 사업 현황에 관한 유용한 정보를 얻을 수 있습니다. 가령, 메트릭은 DAU, Retension, CPU 사용량, 메모리 사용량 등이 있습니다.

로그와 메트릭을 수집해 보신 적이 있나요? 🤔

아래부터는 예시로 생각해주세요! 각자 진행하신 프로젝트 상황에 맞는 답변을 생각해 주세요. 😀

스프링 부트 액추에이터를 사용해 메트릭을 생성하고 프로메테우스에 저장한 다음 그라파나로 시각화한 경험이 있습니다. 수집한 지표는 다음과 같습니다.

  • CPU, 메모리, JVM 힙 사용량
  • 톰캣 스레드 풀과 데이터베이스 커넥션 풀 상태
  • error 레벨 로그 증가량

로깅은 LogBack을 이용했습니다. 그리고, Loki에 7일동안 보관하도록 설정했으며 로그 추적을 위해 MDC를 사용했습니다.

언급해주신 메트릭을 수집하신 이유가 있으신가요? 🤓

CPU, 메모리, JVM 사용량 지표를 수집한 이유는 서비스가 현재 안정적으로 동작하고 있는지 파악하기 위함입니다. 또한, 톰캣 스레드 풀과 커넥션 풀의 상태와 error 레벨 로그를 수집한 이유는 서버 프로그램 내부에 비정상적인 상황이 생기는 것을 신속히 대응하기 위함입니다.

System.out.println을 사용하면 로깅 프레임워크는 사용하지 않아도 되지 않나요? 👀

로그를 출력하는 경우 대기 시간이 발생합니다. 그리고, 로그 또한 데이터이기 때문에 저장 공간을 요구합니다. 따라서, 정말로 필요한 경우에만 로깅을 수행하는 것이 비용 효율적입니다. 하지만, System.out.println은 로그 레벨 설정과 환경 별 필터링을 적용하기 까다롭습니다. 반면, 로깅 프레임워크는 로그 레벨 설정, 필터링 등 로그의 양 조절을 하기 위한 기능을 제공하기 때문에 이를 사용하는 것이 서비스 운영에 유리합니다.

추가 학습 자료를 공유합니다.