테스트를 시작하면서 로그를 확인하면 지저분하게 여러 정보를 출력하긴 하는데, 정작 필요한 정보는 없는 경우가 많았다. 그래서 로깅을 적용하고, 필요한 정보만 출력할 수 있도록 정리하려고 한다.
- 외부 api 호출할 때 파라미터와, 요청 url, 응답
- 에러 발생 시 요청 api url, 데이터
- 어떤 요청에 대한 에러인지 파악하여 시점과 위치를 알기 쉽게 하기
- 예외 전환 시 root cause 정보 추가
- 나중에 확인이 필요한 내용에 대한 정보
운영, 테스트 환경에서 테스트를 하면서 필요했던 내용을 정리하여 먼저 적용해보려고 한다.
로그 레벨
로그 레벨은 로그 메시지의 중요도를 알려준다. 바로 대처가 필요한 장애 상황인지, 인지하고 주의해야 할 상황인지 등을 구별할 수 있다.
DEBUG
- 개발 혹은 테스트 단계에서 해당 기능이 올바르게 작동하는지 확인하기 위한 로그 레벨
- 예) 데이터베이스 연결이 생성되거나 해제되는 시점 혹은 함수 호출에 사용된 인자와 반환 값 등 개발 및 테스트 과정에서 문제를 추척하고 해결하는 데 도움
- INFO 로그에서 기록된 단위 작업의 상세한 단계 기록
- 개발 및 통합 테스트 환경에서 디버깅 용으로 문제 파악
- 운영 환경에서는 남기고 싶지 않은 로그 메시지
INFO
- 애플리케이션에서 정상 작동에 대한 정보, 표준 로그 레벨
- 단위 작업 완료 시 필요한 정보와 결과 기록
- 애플리케이션 상태, 설정 또는 외부 리소스와의 상호작용과 같은 상태 확인을 위한 이벤트
- 예) 인증 API의 백엔드 시스템에서 인증 성공 여부에 따라 사용자가 인증을 요청한 정보
- 서비스 시작 및 종료, 중요한 작업이 완료되거나 실행되는 시점(배치 작업, 정기 작업)
- 특정 단위 등록 및 삭제
- 시스템을 파악하는데 유익한 정보
- 운영 환경에서도 사용
WARN
- 서비스 동작에는 이상이 없지만, 추후 장애로 이어질 수 있는 문제
- 로그인 실패 같이 사용자 입력 오류로도 언제든 발생할 수 있는 일반적인 문제 상황
- WARN 레벨로 책정 후 5번 연속 실패 등 특정 기준치를 넘길 경우 ERROR 레벨로 기록
- 예상치 못한 입력(사용자가 유효하지 않은 입력 제공), 리소스 제한(파일 업로드 사이즈 초과 등)과 같은 경고 기록
- 사용자에게 노출되는 메시지에 상세한 가이드가 필요한 내용
- 발생 추이를 확인하고 주의를 기울일 필요가 있는 상황
- 운영 환경에서도 사용
ERROR
- 심각한 오류나 예외 상황
- 기능 자체가 제대로 작동하지 못하는 문제일 때 남겨야 하며, 즉시 조치가 필요할 때
- 예) 데이터베이스 연결 실패, 내부 시스템 문제로 결제가 실패하는 경우 디스크 저장 공간 부족 등
- 운영 환경에서도 사용
WARN ERROR 레벨
예외, 오류 상황이 모두 ERROR는 아니다. 일반적이지 않은 예외 상황이라도 개발자가 제어할 수 없는 상황이라면 WARN
- 에러/경고 로그에는 스택 트레이스와 콘텍스트 추가
- 단위 작업 기록
외부 API 연동
- 외부 API 호출은 100% 성공으로 관리할 수 없다. 일정 비율이 실패하는 것을 전제해야 한다.
- 1-2번의 실패가 큰 영향을 끼치는 상황이 아니라면 외부 API는 WARN 레벨로
- ERROR 레벨이 필요한 경우
- 결제 등 비즈니스 상 치명적인 API인 경우(고객 실수 제외)
- Retry 호출, 메시지큐 등 재시도 전략이 있는 게 아니면서 딱 1번씩만 호출하는 경우 재시도를 위해 ERROR 로그를 남긴다
사용자의 입력
- 로그인 실패와 5회 이상 연속된 로그인 실패는 WARN과 ERROR로 구분하는 것이 좋다.
- 입력 항목에서 필수 항목 누락
- 형식에 맞지 않는 값으로 요청
로그 레벨을 정리하면서 중요하게 생각했던 부분
- INFO 레벨에서 무의미한 정보를 제외하고 의미 있는 정보를 남기는 것
- WARN 레벨과 ERROR 레벨의 구분
참고
https://jojoldu.tistory.com/712
https://netmarble.engineering/observability-logging-b/
'개발 > Spring' 카테고리의 다른 글
| [Spring] Caffeine Cache 적용 (1) | 2025.02.11 |
|---|---|
| 스프링 내장 캐시 사용하기 (2) | 2025.02.07 |
| 토비의 스프링 - 서비스 추상화 (0) | 2024.10.25 |
| [Querydsl] PageableExecutionUtils count query 오류 (0) | 2024.10.20 |
| [SpringBoot] 이메일 전송 2탄 (네이버메일) (0) | 2024.06.05 |