Update: Apply industry standard logging practices - separate module, dual handlers, JSON format

This commit is contained in:
happybell80 2025-09-08 12:10:56 +09:00
parent d3faba29c7
commit c62a1b9b27

View File

@ -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. 서버 배포
1. app/core/logger.py 생성
2. main.py에서 setup_logging() 호출
3. rb8001/logs 디렉토리 생성 및 .gitignore 추가
4. 로컬 테스트 후 서버 배포