diff --git a/troubleshooting/250908_rb8001_logging_issues.md b/troubleshooting/250908_rb8001_logging_issues.md index 39854e3..c5f7cfd 100644 --- a/troubleshooting/250908_rb8001_logging_issues.md +++ b/troubleshooting/250908_rb8001_logging_issues.md @@ -34,23 +34,13 @@ | 250716_robeing_db_separation | FileHandler로 파일 저장 | 미구현 | | 360_로빙_컨테이너_경량화 | 호스트에서 HDD 심링크 | 미구현 | -## 결정 필요 사항 +## 결정 사항 (표준 방식) -1. **로깅 전략 선택**: - - A. Docker 로그만 사용 (현재 상태 유지) - - B. FileHandler 추가하여 파일 로깅 구현 - - 결정 필요 - -2. **파일 로깅 선택 시**: - - 로그 파일 위치: /code/logs/ 또는 다른 경로 - - 로그 로테이션: TimedRotatingFileHandler 사용 여부 - - 결정 필요 - -3. **HDD 저장 방법**: - - SSHFS 마운트 - - 크론잡 동기화 - - 심링크 - - 결정 필요 +1. **로깅 구조**: app/core/logger.py 모듈 생성 (main.py 직접 수정 X) +2. **핸들러 구성**: StreamHandler + RotatingFileHandler 동시 사용 +3. **로테이션**: 10MB 단위 (TimedRotating보다 예측 가능) +4. **포맷**: JSON 구조화 로그 (분석/파싱 용이) +5. **HDD 저장**: 우선 로컬 파일 로깅 구현, HDD 동기화는 별도 작업 ## 즉시 확인 필요 @@ -58,29 +48,39 @@ 2. SSHFS 설정 여부 3. 크론잡 등록 여부 -## 구현 방안 (결정 후) +## 구현 방안 (업계 표준) ```python -# main.py 수정 예시 (FileHandler 추가 시) +# app/core/logger.py 생성 import logging.handlers +import json -# 기존 코드 -logging.basicConfig(level=log_level) - -# 추가 필요 코드 -if os.path.exists('/code/logs'): - file_handler = logging.handlers.TimedRotatingFileHandler( - '/code/logs/rb8001_app.log', - when='midnight', - interval=1, +def setup_logging(): + # 1. StreamHandler (콘솔) + console = logging.StreamHandler() + + # 2. RotatingFileHandler (파일 - 10MB 로테이션) + file_handler = logging.handlers.RotatingFileHandler( + '/code/logs/rb8001.log', + maxBytes=10*1024*1024, # 10MB backupCount=30 ) - logging.getLogger().addHandler(file_handler) + + # 3. JSON 포맷터 + formatter = logging.Formatter( + '{"time":"%(asctime)s","level":"%(levelname)s","msg":"%(message)s"}' + ) + + # 4. Uvicorn 통합 + logging.getLogger("uvicorn").propagate = True + + logging.basicConfig(handlers=[console, file_handler], + level=logging.INFO) ``` -## 다음 단계 +## 구현 순서 -1. 로깅 전략 결정 -2. 구현 방법 선택 -3. 코드 수정 및 테스트 -4. 서버 배포 \ No newline at end of file +1. app/core/logger.py 생성 +2. main.py에서 setup_logging() 호출 +3. rb8001/logs 디렉토리 생성 및 .gitignore 추가 +4. 로컬 테스트 후 서버 배포 \ No newline at end of file