로깅
•
로깅 라이브러리: 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에서 제공하는 정보