ELK는 Elasticsearch, Logstash 및 Kibana, 이 오픈 소스 프로젝트 세 개를 뜻하는 약자이다.
- Elasticsearch : 검색 및 분석 엔진
- Logstash : 여러 소스에 동시에 데이터를 수집하여 변환한 후 Elasticsearch 같은 “stash”로 전송하는 서버 사이드 데이터 처리 파이프라인
- Kibana : 사용자가 Elasticsearch에서 차트와 그래프를 이용해 데이터를 시각화
여기에 데이터 수집기인 Beats를 추가한 것을 ELK Stack이라고 한다. Beats를 추가하면 다른 서버에서 데이터를 가져오는 것도 가능해진다.
ubuntu 기준으로 elk를 구축해보겠다.
Elasticsearch 설치
# 설치wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.8.1-amd64.debsudo dpkg -i elasticsearch-8.8.1-amd64.deb
# 메모리 수정sudo vi /etc/elasticsearch/jvm.options-Xms256m-Xmx256m
설치된 프로그램의 파일은 아래와 같은 경로에 저장된다. 로그나 명령어를 실행하기 위해선 아래 파일 경로에 접근해야 하니 알아두면 좋다.
- 실행 파일 :
/usr/share/{프로그램명}
- 로그 :
/var/log/{프로그램명}
- 시스템 설정 파일 :
/etc/default/{프로그램명}
- 설정 :
/etc/{프로그램명}
- 데이터 저장 :
/var/lib/{프로그램명}
Elasticsearch는 기본적으로 설치된 서버에서만 통신이 가능하게 설정이 되어있어서 외부접속을 허용하기 위해서는 추가 설정이 필요하다. network.host와 cluster부분을 바꾸고 실행해주자.
## Elasticsearch 외부 접속 허용 ### 수정sudo vi /etc/elasticsearch/elasticsearch.ymlnetwork.host: 0.0.0.0cluster.initial_master_nodes: ["node-1", "node-2"]
# 재시작sudo service elasticsearch restart
# 서비스 등록 및 시작sudo systemctl daemon-reloadsudo systemctl enable elasticsearch.servicesudo systemctl start elasticsearch.servicecurl -X GET "localhost:9200"
# 상태 확인curl localhost:9200/_cat/indices?vcurl -X GET localhost:9200/_cat/health?vcurl -X GET localhost:9200/_cat/nodes?v
Kibana
- Elasticsearch와 함께 작동하도록 설계된 오픈 소스 분석 및 시각화 플랫폼
- Elasticsearch 색인에 저장된 데이터를 검색, 보기 및 상호 작용
- 고급 데이터 분석을 쉽게 수행하고 다양한 차트, 테이블, 맵에서 데이터를 시각화
- 간단한 브라우저 기반의 인터페이스를 통해 실시간으로 Elasticsearch 쿼리의 변경 사항을 표시하는 동적 대시보드를 신속하게 만들고 공유
설치한 뒤 외부 트래픽을 허용하고, elasticSearch와 연결되도록 설정을 수정해준다.
# Kibana 설치wget https://artifacts.elastic.co/downloads/kibana/kibana-8.8.1-amd64.debsudo dpkg -i kibana-8.8.1-amd64.deb
# 설정 변경vi /etc/kibana/kibana.ymlserver.port: 5601server.host: "0.0.0.0"elasticsearch.hosts: ["http://{your_es_ip}:9200"]
# 서비스 등록 및 시작sudo systemctl daemon-reloadsudo systemctl enable kibana.servicesudo systemctl start kibana.service
서버에 웹으로 처음 접속해서 로그인 해보면 이런 화면이 보인다.
Logstash 설치
# 설치wget https://artifacts.elastic.co/downloads/logstash/logstash-8.8.1-amd64.debsudo dpkg -i logstash-8.8.1-amd64.deb
# 설정vi /etc/logstash/logstash.yml
http: host: "0.0.0.0"
# 서비스 등록 및 시작sudo systemctl daemon-reloadsudo systemctl enable logstash.servicesudo systemctl start logstash.service
# 상태 확인tail -f /var/log/logstash/logstash-plain.log
정보를 받아와서 매핑할 형식을 /etc/logstash/conf.d
밑에 파일로 지정해준다.
나는 로깅용으로 써볼 생각이라 grok으로 log 패턴을 정의했다.
# grok 패턴 정의PATTERN_LOG_LINE %{TIMESTAMP_ISO8601:timestamp} :: %{IP:ip} \[%{WORD:httpmethod}\] %{NUMBER:status} path : %{URIPATH:path} query : %{DATA:query} body : %{DATA:body}
input { beats { port => 5088 type => "request" }}
filter { if [type] == "request" { grok { match => { "message" => "%{PATTERN_LOG_LINE}" } } date { match => ["timestamp", "yyyy-MM-dd HH:mm:ss.SSS" ] target => "@timestamp" timezone => "Asia/Seoul" locale => "ko" } }}
output { if [type] == "request" { elasticsearch { hosts => [ "localhost:9200" ] index => "satellite-request-%{+YYYY.MM.dd}" } }}
Beat 설치
# 설치wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.15.1-amd64.debsudo dpkg -i filebeat-7.15.1-amd64.deb
# 설정
filebeat.inputs:- type: filestream id: my-filestream-id enabled: true paths: - /home/repo/satellite/log/*.log # 로그 파일이 저장될 경로로 지정해준다.
# 서비스 등록 및 시작sudo systemctl daemon-reloadsudo systemctl enable filebeat.servicesudo systemctl start filebeat.service
kibana index 추가
Stack Management > Index Management
에 들어가서 Logstash에 설정해놨던 정보랑 같은 이름의 index를 매핑하도록 추가해준다.
그러면 이런식으로 Discover에서 데이터를 확인하는 것이 가능하다.
이 데이터는 내 Spring 서버에서 파일로 출력한 로그 > Beat > Logstash > ElasticSearch > Kibana의 과정을 통해 보여지는 것이다. 지금은 기본적인 세팅만 해놨는데 다른 자세한 커스텀 설정을 많이 할 수 있는 것 같다.
참고