Phase 1: Spring Boot 애플리케이션 로그 관리 전용 ELK Stack
Phase 2: 향후 solved.ac 비즈니스 데이터 분석으로 확장 가능
# Linux/Mac
chmod +x scripts/start-elk.sh
./scripts/start-elk.sh
# Windows (Git Bash 또는 WSL 사용)
bash scripts/start-elk.sh
# 또는 직접 Docker Compose 실행
docker-compose -f docker-compose.elk.yml up -d- Kibana 대시보드: http://localhost:5601
- Elasticsearch API: http://localhost:9200
- Logstash 모니터링: http://localhost:9600
logback-spring.xml에 다음 설정 추가:
<configuration>
<!-- 파일 출력 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/application.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/application.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5level %5pid --- [%15thread] %-40logger{39} : %msg%n</pattern>
</encoder>
</appender>
<!-- TCP 출력 (Logstash 직접 전송) -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>localhost:5000</destination>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp/>
<logLevel/>
<loggerName/>
<message/>
<mdc/>
<arguments/>
<stackTrace/>
</providers>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE"/>
<appender-ref ref="LOGSTASH"/>
</root>
</configuration>필요한 의존성:
// build.gradle.kts
implementation("net.logstash.logback:logstash-logback-encoder:7.4")- Kibana 접속 → Stack Management → Index Patterns
- Create index pattern 클릭
algoreport-logs-*입력 → Next step- Time field:
@timestamp선택 → Create index pattern - 에러 로그용:
algoreport-errors-*도 동일하게 생성
# 에러 로그만 보기
level:ERROR
# 특정 클래스 로그
class:*Controller*
# 시간 범위 + 에러
level:ERROR AND @timestamp:[now-1h TO now]
# 특정 예외
exception_class:*SQLException*
# HTTP 요청 로그
http_method:POST AND request_uri:*/api/v1/users*
- 로그 레벨 분포: Pie chart (level 필드)
- 시간별 로그 량: Histogram (@timestamp)
- 에러 발생 추이: Line chart (level:ERROR)
- 응답 시간 분석: 컨트롤러 로그 기반
- 활성 스레드 모니터링: thread 필드 분석
- 예외 타입별 분류: Terms aggregation (exception_class)
- 에러 발생 패턴: Heat map (시간대별)
- 영향받은 API: request_uri 기반 분석
- 심각도별 분류: severity 필드 활용
크리티컬 에러 발생 시 파일 알림:
# alerts 디렉토리 모니터링
tail -f logs/alerts/critical-errors-$(date +%Y-%m-%d).log# docker-compose.elk.yml에서 수정
environment:
- "ES_JAVA_OPTS=-Xms4g -Xmx8g" # 더 많은 메모리 할당# 30일 이후 로그 자동 삭제
curl -X PUT "localhost:9200/_ilm/policy/algoreport-logs-policy" \
-H "Content-Type: application/json" \
-d '{
"policy": {
"phases": {
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}'-
docker-compose.elk.yml 주석 해제:
- Kafka + Zookeeper
- Debezium CDC
- Schema Registry
-
새로운 파이프라인 추가:
- solved.ac 데이터 수집
- SAGA 이벤트 처리
- 사용자 행동 분석
-
확장된 인덱스:
submissions-{YYYY.MM}saga-events-{YYYY.MM}user-activities-{YYYY.MM}
# 시스템 설정 확인
sudo sysctl -w vm.max_map_count=262144
# 디스크 공간 확인
df -h
# 로그 확인
docker-compose -f docker-compose.elk.yml logs elasticsearch# 로그 파일 권한 확인
ls -la logs/
# Logstash 설정 검증
docker exec algoreport-logstash logstash --config.test_and_exit# 서비스 상태 확인
docker-compose -f docker-compose.elk.yml ps
# Kibana 로그 확인
docker-compose -f docker-compose.elk.yml logs kibana# Elasticsearch 클러스터 상태
curl http://localhost:9200/_cluster/health?pretty
# 인덱스 크기 확인
curl http://localhost:9200/_cat/indices?v
# Logstash 파이프라인 상태
curl http://localhost:9600/_node/stats/pipelines?pretty-
로그 정리 (주간):
# 30일 이상 된 로그 파일 삭제 find logs/ -name "*.log" -mtime +30 -delete
-
인덱스 정리 (월간):
# 오래된 인덱스 삭제 curl -X DELETE "localhost:9200/algoreport-logs-$(date -d '30 days ago' +%Y.%m.%d)"
-
디스크 공간 모니터링:
# Elasticsearch 데이터 크기 확인 du -sh elasticsearch/data/
# 스냅샷 생성
curl -X PUT "localhost:9200/_snapshot/my_backup/snapshot_$(date +%Y%m%d)" \
-H "Content-Type: application/json" \
-d '{
"indices": "algoreport-logs-*,algoreport-errors-*",
"ignore_unavailable": true
}'- 리소스 모니터링: 32GB RAM 환경에서 현재 설정으로 약 10GB 사용
- 디스크 공간: 로그 증가에 따른 저장공간 확보 필요
- 네트워크: 5000, 5044, 5601, 9200, 9600 포트 충돌 주의
- 보안: 프로덕션 환경에서는 인증 활성화 필요
📝 문서 버전: v1.0
📅 최종 수정일: 2025-07-28
👤 작성자: 채기훈