1. Docker & Docker Compose 설치 (macOS 기준)
Docker Desktop 설치 (Compose 포함)
brew install --cask docker
- 설치 후 Docker 앱 실행 → 상태바에 고래 아이콘(🐳) 떠야 정상
- 최신 버전은
docker compose 명령이 내장되어 있음 (docker-compose는 구버전)
설치 확인
docker --version
docker compose version
2. ELK Stack 소개
| 구성 요소 | 역할 설명 |
|---|
| Elasticsearch | 로그 저장, 검색, 색인 처리 |
| Logstash | 로그 수집, 파싱, 전처리 |
| Kibana | 로그 데이터 시각화 UI, 분석 대시보드 |
3. 프로젝트 디렉토리 구성
mkdir elk-study && cd elk-study
touch docker-compose.yml
touch logstash.conf
4. docker-compose.yml 설정
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.10
container_name: elasticsearch
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
ports:
- "9200:9200"
volumes:
- esdata:/usr/share/elasticsearch/data
logstash:
image: docker.elastic.co/logstash/logstash:7.17.10
container_name: logstash
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
ports:
- "5001:5000"
kibana:
image: docker.elastic.co/kibana/kibana:7.17.10
container_name: kibana
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
volumes:
esdata:
version: 항목은 Docker Compose v2 기준으로 생략 권장
5. logstash.conf 설정
input {
tcp {
port => 5000 # TCP 5000번 포트에서 로그를 수신
}
}
filter {
grok {
match => {
"message" => "%{COMBINEDAPACHELOG}" # Apache의 combined 로그 포맷에 맞춰 파싱
}
}
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => "@timestamp" # Elasticsearch용 타임스탬프 필드 지정
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "apache-logs" # 저장될 인덱스 이름
}
stdout { codec => rubydebug } # 콘솔 출력 (디버깅용)
}
6. ELK Stack 실행
docker compose up -d
7. 테스트 로그 전송 (호스트 포트 5001 기준)
echo '127.0.0.1 - - [08/Apr/2025:14:32:00 +0000] "GET /index.html HTTP/1.1" 200 2326' | nc localhost 5001
8. Elasticsearch 인덱스 확인
curl http://localhost:9200/_cat/indices?v
apache-logs 인덱스가 생성되어 있어야 함
9. Kibana 접속 및 Index Pattern 등록
접속
Index Pattern 등록
- 좌측 메뉴 → "Stack Management > Index Patterns"
- "Create index pattern" 클릭
- 입력:
apache-logs*
- Time field 선택:
@timestamp
- Discover 탭에서 로그 확인
에러/경고 해결 요약
| 문제 | 해결 방법 |
|---|
version is obsolete | version: 항목 삭제 |
bind: address already in use (port 5000) | 포트 변경 (5001:5000) 또는 해당 포트 사용 중인 프로세스 종료 |
docker compose: unknown command | Docker Desktop 실행 또는 Compose 플러그인 수동 설치 |
| 로그가 안 들어옴 | logstash.conf 설정 확인 + 로그 포맷 점검 + docker compose logs -f logstash 로 디버깅 |
다음 확장 가능성
| 아이디어 | 설명 |
|---|
| Spring Boot 로그 연동 | Filebeat 또는 파일 input으로 Spring 로그 수집 |
| Nginx 로그 수집 | Nginx access.log를 Logstash로 전송 |
| 에러 알림 연동 | 특정 로그 발생 시 Slack, Email 등 알림 |
| Kibana 대시보드 | IP별 요청 수, 상태코드 비율 등 시각화 |
| 머신러닝 연동 | 로그 기반 이상 징후 탐지 및 자동 알림 |