ELK란 (Elasticsearch + Logstash + Kibana) 를 합쳐놓은것을 ELK라고 한다. Beats를 합쳐놓은 것을 형태를 ELK Stack이라고 한다.

fIlebeat에서 Logstash로 전송을 하고 Logstash에서 필터릴를 해서 Elasticsearch로 보내고 저장하고 그걸 Kibana로 시각화 해서 볼 수 있다.
파일에 저장된 로그파일을 실시간으로 수집해서 Logstash나 Elasticsearch로 보낸다. 경량화 로그 수집기 이다.
다양한 로그들을 수집하고 그걸 필요한 데이터들로만 필터를 하고 추출해 Elasticsearch로 넘겨준다.
검색엔진인데 이게 용도가 로그 데이터, 메트릭스, 분석 쿼리 등을 저장하고 빠르게 검색하는 데 사용이된다.
Elasticsearch에서 수집된 데이터를 기반으로 다양한 시각화(차트, 그래프 등)를 할 수 있다.
── monitoring
│ ├── elk
│ │ ├── elasticsearch
│ │ │ └── elasticsearch.yml
│ │ ├── filebeat
│ │ │ └── filebeat.yml
│ │ ├── kibana
│ │ │ └── kibana.yml
│ │ └── logstash
│ │ ├── logstash.yml
│ │ └── pipeline
│ │ └── logstash.conf
elasticsearch.yml
cluster.name: docker-cluster //elasticsearch의 클러스트 이름
network.host: 0.0.0.0 //Elasticsearch가 모든 네트워크 인터페이스에서 접근 가능
xpack.security.enabled: true //xpack.security.enabled는 Elasticsearch의 X-Pack 보안 기능을 활성화
filebeat.yml
filebeat.inputs: //Filebeat가 수집할 로그 파일들의 입력 설정을 정의
- type: log //로그 타입
enabled: true //입력소스 활성화
paths:
- /app/logs/ *.log // 수집할 로그파일의 경로를 설정
output.logstash: //수집한 데이터를 logstash로 전송하는 출력 설정을 정의
hosts: ["logstash:5044"] //logstash 호스트의 5044 포트로 설정
kibana.yml
server.port: 5601 //kibana가 서버 수신할 포트
server.host: "0.0.0.0"//모든 IPv4 인터페이스에서 접속을 허용
elasticsearch.hosts: ["http://elasticsearch:9200"] //Kibana가 연결할 Elasticsearch 인스턴스의 URL
logstash.conf
input { //Logstash가 데이터를 수집할 입력 소스를 정의
beats { //Beats 입력 플러그인
port => 5044 //Logstash가 Beats 에이전트로부터 데이터를 수신할 포트
}
}
output { //Logstash가 수집한 데이터를 전송할 출력 소스를 정의
elasticsearch { //Elasticsearch 출력 플러그인
hosts => ["elasticsearch:9200"]//데이터를 전송할 Elasticsearch 인스턴스의 URL
index => "logs-%{+YYYY.MM.dd}" //데이터를 저장할 인덱스 이름
}
}
logstash.yml
http.host: "0.0.0.0" //모든 인터페이스에서 수신 대기
log.level: info // 로그 레벨 설정
path.logs: /var/log/logstash //저장할 위치(도커)
docker-compose.yml
elasticsearch:
container_name: elasticsearch //컨테이너 이름
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.4
environment:
- discovery.type=single-node // 단일 노드로 클러스터
ports:
- "9200:9200" //호스트의 포트 9200을 컨테이너의 포트 9200
networks:
- teamhnet //teamhnet 네트워크에 연결
logstash:
container_name: logstash //컨테이너 이름
image: docker.elastic.co/logstash/logstash:7.17.4
ports:
- "5044:5044" //호스트의 포트 5044를 컨테이너의 포트 5044에 매핑
volumes:
- ./monitoring/elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
- ./monitoring/elk/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml
// :를 기준으로 왼쪽(로컬)을 오른쪽(도커 (컨테이너))로 매핑함
networks:
- teamhnet //teamhnet 네트워크에 연결
kibana:
container_name: kibana //컨테이너 이름
image: docker.elastic.co/kibana/kibana:7.17.4
ports:
- "5601:5601" //호스트의 포트 5601를 컨테이너의 포트 5044에 매핑
environment:
ELASTICSEARCH_HOSTS: "http://elasticsearch:9200" //ELASTICSEARCH_HOSTS: Kibana가 Elasticsearch에 연결할 때 사용할 호스트 주소
networks:
- teamhnet//teamhnet 네트워크에 연결
filebeat:
container_name: filebeat //컨테이너 이름
image: docker.elastic.co/beats/filebeat:7.17.4
volumes:
- ./monitoring/elk/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml
// :를 기준으로 왼쪽(로컬)을 오른쪽(도커 (컨테이너))로 매핑함
- ./app/logs:/app/logs:ro //로컬 /app/logs 디렉토리를 컨테이너의 /app/logs 경로로 읽기 전용으로 매핑
depends_on:
- logstash //filebeat 컨테이너가 logstash 컨테이너에 의존
networks:
- teamhnet//teamhnet 네트워크에 연결