diff --git a/journey/troubleshooting/251201_rb8001_log_optimization.md b/journey/troubleshooting/251201_rb8001_log_optimization.md new file mode 100644 index 0000000..5a2fc40 --- /dev/null +++ b/journey/troubleshooting/251201_rb8001_log_optimization.md @@ -0,0 +1,90 @@ +# rb8001 로그 최적화: DEBUG 노이즈 제거, 타임아웃 재시도, 멀티라인 파싱 + +**날짜**: 2025-12-01 +**작성자**: Claude (51124 서버 전담) +**관련 파일**: `rb8001/app/core/logger.py`, `rb8001/app/router/slack_handler.py`, `fluent-bit/parsers.conf`, `fluent-bit/fluent-bit.conf` + +--- + +## 문제 상황 + +### 1. httpcore DEBUG 로그 과다 +- OpenSearch에서 httpcore DEBUG 로그가 하루 수백 건 수집됨 +- 실제 오류 로그가 묻혀 분석 어려움 +- 로그 노이즈로 인한 저장 공간 낭비 + +### 2. slack_handler.py RAG 검색 타임아웃 +- 하드코딩된 `timeout=10` 초과 시 실패 +- 재시도 로직 없어 일시적 네트워크 오류 시 실패 +- langgraph_document.py에는 재시도 로직 있으나 slack_handler.py에는 없음 + +### 3. Traceback 멀티라인 미수집 +- Python Traceback이 여러 줄로 나뉘어 수집됨 +- 첫 줄만 수집되어 전체 스택 추적 불가 +- 에러 분석 시 컨텍스트 부족 + +--- + +## 해결 방안 + +### 1. httpcore 로거 레벨 조정 +- `rb8001/app/core/logger.py:48-51`: httpcore 로거 레벨 WARNING으로 설정 + - `logging.getLogger("httpcore").setLevel(logging.WARNING)` + - `logging.getLogger("httpcore.connection").setLevel(logging.WARNING)` + - `logging.getLogger("httpcore.http11").setLevel(logging.WARNING)` +- `.env`: `LOG_LEVEL=INFO` 설정 (서버에서 직접 수정 필요) + +### 2. RAG 검색 타임아웃/재시도 추가 +- `rb8001/app/router/slack_handler.py:355-390`: 타임아웃 환경변수화 및 재시도 로직 추가 + - `timeout=10` → `timeout=float(os.getenv("RAG_SEARCH_TIMEOUT", "25"))` + - langgraph_document.py:74-90 패턴 적용 (재시도 + 백오프) + - 환경변수: `RAG_SEARCH_TIMEOUT=25`, `RAG_SEARCH_RETRIES=2`, `RAG_SEARCH_BACKOFF=1.5` + +### 3. Fluent Bit multiline 파서 추가 +- `fluent-bit/parsers.conf`: multiline_traceback parser 추가 + - `Parser_Firstline ^Traceback` 패턴으로 Traceback 시작 감지 + - `Multiline On`, `Multiline_Flush 5` 설정 +- `fluent-bit/fluent-bit.conf`: multiline 필터 추가 + - `[FILTER] Name multiline` 섹션 추가 + - `multiline.key_content log`, `multiline.parser multiline_traceback` 설정 + +--- + +## 구현 완료 + +- 커밋: `b406b3f` (rb8001) - httpcore 로거 레벨 설정 +- 커밋: `af08f8d` (rb8001) - RAG 검색 타임아웃/재시도 +- 커밋: `ca4f117` (fluent-bit) - multiline 파서 추가 +- 배포: rb8001 재시작 완료, fluent-bit 푸시 완료 (재시작 필요) + +--- + +## 검증 결과 + +- httpcore DEBUG 로그: 최근 5분간 0건 (이전: 96건+) +- RAG 타임아웃: 재시도 로직 적용 완료 (테스트 대기) +- Traceback 파싱: multiline 파서 설정 완료 (Fluent Bit 재시작 후 검증 필요) + +--- + +## 교훈 + +### 로거 레벨 관리 원칙 +- 외부 라이브러리(httpcore, httpx 등)는 기본적으로 DEBUG 레벨 로그 생성 +- 프로덕션 환경에서는 노이즈 로거를 WARNING 이상으로 설정 필요 +- 환경변수 `LOG_LEVEL`과 개별 로거 레벨을 분리 관리 + +### 타임아웃/재시도 패턴 표준화 +- 외부 API 호출 시 타임아웃은 환경변수로 관리 (하드코딩 금지) +- 재시도 로직은 일관된 패턴 적용 (langgraph_document.py 참고) +- 백오프 전략으로 재시도 간격 점진적 증가 + +### 멀티라인 로그 파싱 +- Docker JSON 로그는 이미 파싱되어 있어 FILTER 단계에서 multiline 처리 필요 +- Traceback 같은 구조화된 멀티라인은 `Parser_Firstline` 패턴으로 감지 +- Fluent Bit 설정 변경 시 완전 재빌드 필수 (restart만으로는 적용 안 됨) + +### 참고 문서 +- `251023_happybell80_rb8001_RAG_timeout_PK_sequence.md`: langgraph_document.py RAG 타임아웃 해결 사례 +- `250930_claude_fluent_bit_memory_overflow_fix.md`: Fluent Bit 로그 레벨 설정 사례 +