Search
💻

인프라 구축: 로깅&모니터링

날짜
2024/08/08
파트
백엔드
서기
블로그 업로드 여부

로깅

로깅 라이브러리: log4j, logback, log4j2 중 logback 으로 결정
Slf4j의 구현체
logback은 spring boot에 포함되어 있어 추가적인 의존성 설정이 불필요하다.
로그백-클라우드워치 연동용 라이브러리 → 사용 x
로깅의 수집 대상
DEBUG: Info 로그에서 기록된 단위 작업의 상세한 단계(운영 환경에서는 남기고 싶지 않은 경우)
SQL 쿼리
INFO: 일반적인 사용자 요청과 응답의 요약, 또는 개발자가 의도한 오류 상황이 발생한 경우
2xx API: ID, 요청(HTTP 메서드, URL, 바디) / 응답(statusCode, 실행시간)
multipart/form-data 에선 바디 제외
4xx API: ID, 요청(HTTP 메서드, URL, 바디) / 응답(statusCode, 실행시간, 에러메시지)
인증 필터: 로그인한 사용자 ID
애플리케이션 시작/종료 정보
WARN: 당장 오류 상황이 아니거나 처리 가능한 오류상황이지만, 향후 시스템 에러로 이어질 수 있는 경우
엣지 케이스 API: ID, 요청(HTTP 메서드, URL, 바디) / 응답(실행시간, 스택 트레이스)
크롤링 실패, 회원가입 닉네임 생성 실패
ERROR: 서비스 동작에 이상이 있을 정도로 문제가 발생한 경우
5xx API: ID, 요청(HTTP 메서드, URL, 바디) / 응답(실행시간, 스택 트레이스, 에러메시지)
외부 API(로그인 등), 랜덤 닉네임, 크롤링 등.. 제어할 수 없는 부분
로그 형식 (예시 → 우리 방식으로 변경 필요)
DEBUG
INFO
2xx API
{ "uri": "/offerings", "http-method": "POST", "identifier": "3a76c903614e4e", "request-body": {}, "status-code" : 201, "latency": "0.123456" } // user-id 여기 넣는 거 고려해보기
SQL
복사
4xx API
{ "uri": "/offerings", "http-method": "POST", "identifier": "3a76c903614e4e", "request-body": {}, "latency": "0.123456" "status-code" : 404, "error-message": "존재하지 않는 회원입니다." }
SQL
복사
애플리케이션 시작/종료 정보
WARN
엣지 케이스 API
{ "uri": "/offerings", "http-method": "POST", "identifier": "3a76c903614e4e", "request-body": {}, "latency": "0.123456" "status-code" : 404, "error-message" : "서버 에러입니다.", "stacktrace": "java.io.FileNotFoundException: C:/Users/tamagochi/abc.txt (Is a directory) at java.io.FileOutputStream.open0(Native Method) at java.io.FileOutputStream.open(FileOutputStream.java:270) at java.io.FileOutputStream.(FileOutputStream.java:213) at JavaHungry.main(JavaHungry.java:10) ..." }
SQL
복사
ERROR
5xx API: 요청
{ "uri": "/offerings", "http-method": "POST", "identifier": "3a76c903614e4e", "request-body": {}, "latency": "0.123456" "status-code" : 500, "error-message" : "서버 에러입니다.", "stacktrace": "java.io.FileNotFoundException: C:/Users/tamagochi/abc.txt (Is a directory) at java.io.FileOutputStream.open0(Native Method) at java.io.FileOutputStream.open(FileOutputStream.java:270) at java.io.FileOutputStream.(FileOutputStream.java:213) at JavaHungry.main(JavaHungry.java:10) ..." }
SQL
복사

Reference

넷마블의 로깅 팁
1.
ERROR와 WARN 로그에는 꼭 스택 트레이스와 콘텍스트 정보를 넣는 것이 좋다.
2.
INFO 레벨 로그에는 작업의 중간 진행상황을 기록하기 보다, 하나의 작업 단위가 완료되면 해당 작업을 요약한 내용을 기록하는 것이 좋다.
3.
편리하게 그룹화할 수 있도록 고유한 에러 코드를 필드에 추가하는 것이 좋다.
4.
통합 테스트 단계에서부터 로깅 내용을 신경써서 관찰하거나, 아예 로깅 내용을 테스트코드에 포함하는 것이 좋다. 이 과정에서 내용이 부실한 로그나 레벨이 맞지 않는 로그를 색출할 수 있기 때문이다.
5.
로그 발생 원인은 가능한 친절하게 작성하는 것이 좋다.
6.
민감한 정보는 필터링하거나 수집되지 않게 주의를 기울이는 것이 좋다.

모니터링

방식: 푸시, 풀 중 풀 방식 선택
푸시(우리 서버 → 모니터링 서버): 실시간으로 가져올 수 있지만, 부하 생길 수 있음
풀(모니터링 서버 → 우리 서버): 부하 없지만, 못가져올 수도 있음
모니터링 툴
프로메테우스: 메트릭 수집 가능
알림 관리 시스템인 Alertmanager와 연동 가능
로키: 로그 수집 가능
로그 데이터를 효율적으로 저장 및 쿼리 가능
시각화 툴
그라파나: 다양한 데이터 소스를 시각화 가능
Prometheus, Loki, Graphite, InfluxDB 등 다양한 데이터 소스 지원
커스텀 가능한 대시보드와 알림 기능 제공
모니터링 + 시각화 툴
클라우드 워치: 메트릭 수집, 로그 수집, 시각화 전부 가능
메트릭: AWS 리소스(예: EC2)의 성능 데이터를 수집 및 모니터링
로그: 애플리케이션, 시스템 로그, AWS 서비스 로그 등을 수집 가능
로그 분석, 경고 설정, 대시보드 제공
무료로 볼 수 있는 메트릭 개수가 제한
툴 선택: 클라우드 워치로 결정
1안: 프로메테우스+로키+그라파나
2안: 클라우드 워치
모니터링 대상(수집 대상)
CPU
DISK I/O
RAM
Network
Application
Exception Log (500, 400)
입력값
오류 내용 (500은 stack trace, 400은 오류 메시지)
Request Log
API latency
알람 대상 : 추후 정해야 함
모니터링 정보 수집 방법
EC2에서 제공하는 정보
CPU 사용률, 크레딧 사용량, 크레딧 밸런스
Network 입출력, 패킷입출력
SpringBoot Actuaotr에서 제공하는 정보
애플리케이션의 각종 정보