Step 4: 로그 분석기 개발 (4주차)
목표
- 3주차 설계·샘플을 바탕으로 규칙만으로 AnalyzeLogResponse 형태의 구조화 결과를 생성
- 원인 분리를 위해 AI(LLM)는 사용하지 않음
병합된 상세 노트
GC 덤프 분석기
원본: GC 덤프 분석기 (내부 문서)
| 항목 | 내용 |
|---|---|
| 문서 버전 | 1.0 |
| 작성 기준일 | 2026-05-11 |
| 상태 | Step 4 완료 (실제 로그 예시 포함) |
| 근거 문서 | lena-ts-log-analysis(README·CONTRACT·REQUIREMENTS), dev-docs(19), shared-contracts |
1. 개요
1.1 목적
본 문서는 GC 로그 분석 기능의 핵심 로직 구현과 시스템 전체 통합 과정을 기록한다. JVM GC 로그를 정규식 기반으로 분석하여 구조화된 진단 결과를 제공하고, 챗봇 에이전트와 연동하는 것을 목표로 한다.
1.2 핵심 가치
- AI 의존도를 낮추고 신뢰할 수 있는 규칙(Rule-based)에 근거한 전문가 수준의 진단 제공
- JVM GC 로그를 정규식 기반으로 분석하여 구조화된 진단 결과를 제공
- 챗봇 에이전트와 연동하여 파일 업로드 기반 자동 분석 지원
2. 구현된 분석 패턴 (Pattern Detection)
총 7가지 이상의 핵심 패턴을 감지하며, 각각의 심각도(Severity)에 따른 권장 조치를 제공한다.
2.1 감지 패턴 목록
| 패턴명 | 심각도 | 감지 기준 (Regex/Keyword) | 권장 조치 요약 |
|---|---|---|---|
| Full GC | HIGH | [Full GC, Full GC (Ergonomics) | 힙 크기 검토 및 메모리 누수 점검 |
| Long Pause | HIGH | 정지 시간 > 1.0초 | GC 튜닝 및 애플리케이션 병목 확인 |
| Promotion Failed | HIGH | promotion failed | Old Gen 공간 증설 및 객체 생존 주기 분석 |
| Concurrent Failure | HIGH | concurrent mode failure | CMS/G1 설정 최적화 |
| Allocation Failure | MEDIUM | Allocation Failure | Young 영역 크기 및 객체 할당 속도 점검 |
| Metaspace Full | MEDIUM | Metaspace | MaxMetaspaceSize 설정 확인 |
| Minor GC | INFO | 일반 [GC 패턴 | 정상 활동 모니터링 |
3. 시스템 통합 (System Integration)
3.1 에이전트 파일 읽기 연동
- 기능: 사용자가 채팅창에 업로드한 파일을 에이전트가 직접 읽을 수 있도록 전용 API(
GET /chat-content/{file_id})를 구현함. - 자동화: 파일 확장자(.log, .txt)를 인식하여 자동으로 GC 분석 로직을 호출하도록 에이전트 엔진 고도화.
3.2 데이터베이스(MySQL) 연동
- 목적: 대용량 파일 업로드 시 메타데이터를 안정적으로 관리.
- 해결: MySQL 8 보안 인증(sha2) 이슈를
cryptography패키지 추가를 통해 해결하고,docker-compose환경 변수를 일괄 정비함.
3.3 프론트엔드 최적화
- Vite Proxy:
/api/v1/log-analysis경로를 분석기 서비스(8102)로 직접 라우팅하여 성능 및 연동성 확보.
4. 검증 결과
| 항목 | 내용 |
|---|---|
| 테스트 세트 | 정상/주의/장애 상황을 아우르는 10가지 시나리오 로그 생성 및 검증 완료 |
| UI 동작 | 파일 업로드 → 에이전트 전달 → 분석 결과 출력의 전체 흐름(End-to-End) 확인 |
5. 상세 코드 변경 로그 (Detailed Code Changes)
5.1 분석 엔진 및 API (log-analysis 서비스)
| 파일 | 변경 내용 |
|---|---|
services/analyzer.py | _analyze_gc 메서드 신규 구현: 정규식 기반 패턴 감지 로직 추가. analyze 메인 메서드에 GC 타입 분기 처리 통합. |
routers/chat_upload.py | GET /chat-content/{file_id} 엔드포인트 추가: 업로드된 파일의 본문을 읽어오는 기능. |
services/chat_upload_store.py | get_record(file_id) 메서드 추가: DB에서 파일 메타데이터를 조회하는 로직 구현 (MySQL/SQLite 공통). |
5.2 에이전트 엔진 (agent-engine 서비스)
| 파일 | 변경 내용 |
|---|---|
ax-workshop/agent-engine/app/main.py | workshop_invoke 로직 수정: file_id가 전달될 경우 로그 분석기의 본문 가져오기 API를 호출하도록 징검다리 로직 추가. 파일 확장자에 따른 log_type (GC, THREAD_DUMP 등) 자동 판별 로직 추가. |
5.3 인프라 및 환경 설정
| 파일 | 변경 내용 |
|---|---|
docker-compose.yml | log-analysis 서비스에 MySQL 접속 정보(LOG_ANALYSIS_MYSQL_*) 환경 변수 주입. |
frontend/vite.config.ts | Vite 개발 서버 프록시 설정에 /api/v1/log-analysis 전용 경로 추가 (8102 포트 직접 연결). |
requirements.txt | MySQL 8 보안 인증 지원을 위한 cryptography 패키지 명시. |
6. 주요 API 명세 (API Specifications)
6.1 로그 분석기 전용 (Port: 8102)
| 기능 | 엔드포인트 | 설명 |
|---|---|---|
| 로그 분석 | POST /api/v1/log-analysis/analyze | 로그 본문을 직접 분석 |
| 파일 업로드 | POST /api/v1/log-analysis/chat-upload | 분석용 파일 업로드 및 ID 발급 |
| 본문 조회 | GET /api/v1/log-analysis/chat-content/{file_id} | 업로드된 파일 내용 확인 |
| 헬스체크 | GET /api/v1/log-analysis/health | 서비스 및 DB 상태 확인 |
6.2 통합 및 에이전트 (Port: 8100/8101)
| 기능 | 엔드포인트 | 설명 |
|---|---|---|
| 에이전트 채팅 | POST /api/v1/chat | 에이전트 대화 및 파일 기반 분석 요청 |
| 분석 프록시 | POST /api/v1/workshop/proxy/analyze | BFF를 통한 간접 분석 요청 |
7. API 호출 예시 (Request & Response Examples)
7.1 정상 Young GC 분석 (gc_sample_1_normal.log)
Request (curl):
curl -X POST http://localhost:8102/api/v1/log-analysis/analyze \
-H "Content-Type: application/json" \
-d '{
"log_type": "GC",
"content": "[2024-05-11T10:00:01.000+0900] [GC (Allocation Failure) [PSYoungGen: 512K->64K(1024K)] 512K->128K(4096K), 0.0152340 secs]"
}'Response:
{
"log_type": "GC",
"summary": "GC 로그에서 1개의 대표 패턴을 감지했다.",
"detected_patterns": ["YOUNG_GC"],
"signals": [
{
"code": "YOUNG_GC",
"severity": "INFO",
"message": "Minor GC(Young 영역 수집) 활동이 감지되었다."
}
],
"recommended_actions": [
"일시적인 Young GC는 정상이지만, 빈도가 너무 잦다면 Young 영역 크기 조절을 검토한다."
],
"parser_version": "0.2.0-rules"
}7.2 긴 정지 시간 발생 (gc_sample_3_long_pause.log)
Request (curl):
curl -X POST http://localhost:8102/api/v1/log-analysis/analyze \
-H "Content-Type: application/json" \
-d '{
"log_type": "GC",
"content": "GC(316) Pause Young (Mixed) (G1 Evacuation Pause) 6642M->5421M(8192M) 2812.421ms"
}'Response:
{
"log_type": "GC",
"summary": "GC 로그에서 1개의 대표 패턴을 감지했다.",
"detected_patterns": ["LONG_PAUSE"],
"signals": [
{
"code": "LONG_PAUSE",
"severity": "HIGH",
"message": "GC 정지 시간이 1초(임계치)를 초과한 2.812s가 감지되었다."
}
],
"recommended_actions": [
"정지 시간이 매우 길어 서비스 지연이 우려된다. GC 튜닝 옵션을 검토하거나 힙 크기 적절성을 확인한다."
],
"parser_version": "0.2.0-rules"
}7.3 파일 업로드 (chat-upload)
Request (curl):
curl -X POST http://localhost:8102/api/v1/log-analysis/chat-upload \
-F "file=@{PROJECT_DIR}/Step4/LogExample/gc_sample_1_normal.log"Response:
{
"ok": true,
"file_id": "file_8a2b3c4d5e6f...",
"original_name": "gc_sample_1_normal.log",
"stored_name": "file_8a2b3c4d5e6f..._gc_sample_1_normal.log",
"size": 256,
"content_type": "text/plain",
"uploaded_at": "2024-05-12T00:50:00.123456"
}7.4 업로드된 파일 본문 조회 (chat-content)
Request (curl):
curl -X GET http://localhost:8102/api/v1/log-analysis/chat-content/file_8a2b3c4d5e6f...Response:
{
"ok": true,
"content": "[2024-05-11T10:00:01.000+0900] [GC (Allocation Failure) ...]",
"original_name": "gc_sample_1_normal.log"
}