//
Search
🐼

로깅, 모니터링

블로그로 정리해 올린 글입니다
작성자

로깅

로깅 라이브러리: log4j, logback, log4j2 중 logback 으로 결정
Slf4j의 구현체
logback은 spring boot에 포함되어 있어 추가적인 의존성 설정이 불필요하다.
로깅의 수집 대상
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에서 제공하는 정보
애플리케이션의 각종 정보