Update: Apply industry standard logging practices - separate module, dual handlers, JSON format
This commit is contained in:
parent
d3faba29c7
commit
c62a1b9b27
@ -34,23 +34,13 @@
|
|||||||
| 250716_robeing_db_separation | FileHandler로 파일 저장 | 미구현 |
|
| 250716_robeing_db_separation | FileHandler로 파일 저장 | 미구현 |
|
||||||
| 360_로빙_컨테이너_경량화 | 호스트에서 HDD 심링크 | 미구현 |
|
| 360_로빙_컨테이너_경량화 | 호스트에서 HDD 심링크 | 미구현 |
|
||||||
|
|
||||||
## 결정 필요 사항
|
## 결정 사항 (표준 방식)
|
||||||
|
|
||||||
1. **로깅 전략 선택**:
|
1. **로깅 구조**: app/core/logger.py 모듈 생성 (main.py 직접 수정 X)
|
||||||
- A. Docker 로그만 사용 (현재 상태 유지)
|
2. **핸들러 구성**: StreamHandler + RotatingFileHandler 동시 사용
|
||||||
- B. FileHandler 추가하여 파일 로깅 구현
|
3. **로테이션**: 10MB 단위 (TimedRotating보다 예측 가능)
|
||||||
- 결정 필요
|
4. **포맷**: JSON 구조화 로그 (분석/파싱 용이)
|
||||||
|
5. **HDD 저장**: 우선 로컬 파일 로깅 구현, HDD 동기화는 별도 작업
|
||||||
2. **파일 로깅 선택 시**:
|
|
||||||
- 로그 파일 위치: /code/logs/ 또는 다른 경로
|
|
||||||
- 로그 로테이션: TimedRotatingFileHandler 사용 여부
|
|
||||||
- 결정 필요
|
|
||||||
|
|
||||||
3. **HDD 저장 방법**:
|
|
||||||
- SSHFS 마운트
|
|
||||||
- 크론잡 동기화
|
|
||||||
- 심링크
|
|
||||||
- 결정 필요
|
|
||||||
|
|
||||||
## 즉시 확인 필요
|
## 즉시 확인 필요
|
||||||
|
|
||||||
@ -58,29 +48,39 @@
|
|||||||
2. SSHFS 설정 여부
|
2. SSHFS 설정 여부
|
||||||
3. 크론잡 등록 여부
|
3. 크론잡 등록 여부
|
||||||
|
|
||||||
## 구현 방안 (결정 후)
|
## 구현 방안 (업계 표준)
|
||||||
|
|
||||||
```python
|
```python
|
||||||
# main.py 수정 예시 (FileHandler 추가 시)
|
# app/core/logger.py 생성
|
||||||
import logging.handlers
|
import logging.handlers
|
||||||
|
import json
|
||||||
|
|
||||||
# 기존 코드
|
def setup_logging():
|
||||||
logging.basicConfig(level=log_level)
|
# 1. StreamHandler (콘솔)
|
||||||
|
console = logging.StreamHandler()
|
||||||
# 추가 필요 코드
|
|
||||||
if os.path.exists('/code/logs'):
|
# 2. RotatingFileHandler (파일 - 10MB 로테이션)
|
||||||
file_handler = logging.handlers.TimedRotatingFileHandler(
|
file_handler = logging.handlers.RotatingFileHandler(
|
||||||
'/code/logs/rb8001_app.log',
|
'/code/logs/rb8001.log',
|
||||||
when='midnight',
|
maxBytes=10*1024*1024, # 10MB
|
||||||
interval=1,
|
|
||||||
backupCount=30
|
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. 로깅 전략 결정
|
1. app/core/logger.py 생성
|
||||||
2. 구현 방법 선택
|
2. main.py에서 setup_logging() 호출
|
||||||
3. 코드 수정 및 테스트
|
3. rb8001/logs 디렉토리 생성 및 .gitignore 추가
|
||||||
4. 서버 배포
|
4. 로컬 테스트 후 서버 배포
|
||||||
Loading…
x
Reference in New Issue
Block a user