[HAN-266] bridge.py 로그 다이어트 — file handler INFO + 라이브러리 로거 WARNING 확장
Summary
bridge.py:setup_logging() file handler를 DEBUG → INFO로 상향하고 noisy 라이브러리 로거 8개를 WARNING으로 명시 고정. bridge.log의 full Slack event payload 덤프 차단 + log_monitor.py false-positive cascade 근본 차단.
Context
사건 흐름
1. #pantheon-alerts에 "Process exit" 알림 반복 발생.
2. Asurada 1차 분석: payload 안에 exit 1 텍스트가 우연 매칭. → log_monitor.py IGNORE_PATTERNS에 한 줄 추가하는 우회 fix 제안.
3. Jarvis 자문(feedback_root_cause_first): 우회 fix는 다음 라이브러리 페이로드에서 또 터짐. 근본 원인은 bridge.py:125 file handler가 DEBUG라서 라이브러리들이 full request/response payload를 통째로 로그에 덤프한다는 점.
4. 방향 전환 → 본 PR.
측정 데이터
| 항목 | 값 |
|---|---|
| 어제 `bridge.log` 크기 | ~300 MB |
| 오늘 1시간 누적 | ~79 MB |
| HAN-146 / HAN-248 계열 false-positive PR | 6+건 |
Plan / Scope
작업 항목
- [x]
bridge.py:setup_logging()file handlersetLevel(DEBUG → INFO) - [x] root logger
setLevel(DEBUG → INFO) - [x] 라이브러리 로거 WARNING 확장:
slack_bolt,slack_sdk,urllib3,httpx,httpcore,asyncio,websockets,websocket - [x] docstring 갱신 ("File + console both INFO. DEBUG payload dumps flood bridge.log otherwise.")
- [x]
log_monitor.pyIGNORE_PATTERNS 안전망 유지 (수정 없음)
AC
- [x] file handler level = INFO
- [x] slack_bolt 외 라이브러리 로거 최소 3개 이상 WARNING 명시
- [x]
jarvis로거는 INFO 유지 — 시작/종료/에러 가시 - [x] PR 작성 +
/code-review:code-review통과 (no issues) - [ ] 재시작 후 1시간 동안
bridge.log증가량 측정 (hangman 검증 단계)
Decisions
| 결정 | 근거 |
|---|---|
| `root.setLevel(INFO)` — 우리 코드 `log.debug(...)` ~20개 호출 silently drop | 시작/종료/에러는 INFO+이므로 운영 가시성에 영향 없음. DEBUG 옵저버빌리티 손실 < 디스크/오탐 비용 |
| 우회 fix(IGNORE_PATTERNS 한 줄 추가) 폐기 | `feedback_root_cause_first` — 보편 패턴(라이브러리 로거 WARNING 고정)과의 차이가 근본 원인 |
| `log_monitor.py` IGNORE_PATTERNS 유지 | 라이브러리 동작 변경(예: 새 SDK 버전이 INFO에서도 payload 덤프) 대비 안전망 |
| `asyncio`도 WARNING 명시 (기본 WARNING이라 redundant) | 의도 명시. 향후 root level 다시 내릴 때 안전 |
Risks
| 위험 | 영향 | 대응 |
|---|---|---|
| `jarvis` logger의 DEBUG 호출 ~20개 모두 silent drop | 운영 진단 시 정보 부족 가능 | INFO 레벨에 충분한 시작/종료/에러 로그 존재. 디버깅 필요 시 임시로 `root.setLevel(DEBUG)` 토글 |
| 라이브러리 로거 누락 (예: 새 의존성) | 다시 페이로드 덤프 시작 | `log_monitor.py` IGNORE_PATTERNS 안전망 + 1시간 후 크기 검증 |
| 새 SDK 버전이 WARNING 레벨로 payload 덤프 | false-positive 재발 | IGNORE_PATTERNS + 정기 grep 모니터링 |
Result
완료된 것
- PR #97 squash merged → main
00b6aae(2026-05-22 01:20 KST) - Linear HAN-266 Done
- 코드 리뷰 통과 (no issues found)
변경 라인
bridge.py setup_logging() (lines 117–146) — +15/−5
배운 것
1. 우회 fix vs 근본 원인 진단: 같은 매니패스테이션(false-positive)이 라이브러리 layer마다 반복되면 IGNORE_PATTERNS 누적은 증상 도구화. 1차 원인(producer side = 로깅 레벨)을 끊는 게 정답.
2. 라이브러리 로거는 명시 차단: Python 표준 logging은 root에 propagate. setLevel(DEBUG) root + 라이브러리 로거 NOTSET이면 라이브러리 내부 DEBUG 다 흘러옴. slack_bolt·slack_sdk 외에도 urllib3·httpx·httpcore·websockets가 noisy candidates.
3. jarvis 로거 분리 운영: log = logging.getLogger("jarvis")를 별도 named logger로 두면, root level과 분리해 우리 코드만 DEBUG로 내릴 수 있는 옵션이 열림. 본 PR에서는 INFO 통일 선택했지만, 향후 디버깅 모드에서 jarvis만 DEBUG 토글 가능.
링크
- PR: https://github.com/hangseung/pantheon/pull/97
- Merge commit: https://github.com/hangseung/pantheon/commit/00b6aaef81fd3a4c5c0788969631f4c88ce18d12
- Linear: https://linear.app/hangman-lab/issue/HAN-266
- 선행 패턴: PR #86 (HAN-219) — slack_bolt/slack_sdk만 WARNING 한 첫 단계