티스토리 뷰
ELK Stack(ElasticSearch, Logstash, Kibana + Filebeat)
필자는 회사 프로젝트를 진행하면서 APM을 어플리케이션에 붙여서 모니터링을 진행해야 했기에 오픈 소스인 ELK Stack을 이용해 보았다.
ELK Stack을 알아보기 전에 ElasticSearch에 대해 알아보자.
ElasticSearch 란?
ElasticSearch는 Apache Lucene 기반의 Java 오픈소스 분산형 RESTful 검색 및 분석 엔진 입니다. 방대한 양의 데이터에 대해 실시간으로 저장과 검색 및 분석등의 작업을 수행할 수 있습니다.
특히 정형데이터, 비정형 데이터, 지리 데이터등 모든 타입의 데이터를 처리할 수 있습니다. ElasticSearch는
JSON 문서로 데이터를 저장하기 때문입니다.
- ELK Stack 란?
기존
ELK(ElasticSearch + Logstash + Kibana)에 FileBeats
가 들어간 형태를 말한다.ElasticSearch
는 검색 및 분석 엔진 입니다.Logstash
는 여러 소스에서 동시에 데이터를 수집하여 변환한 후 ElasticSearch 같은 'stash'로 전송하는 서버 사이드 데이터 처리 파이프 라인Kibana
는 사용자가 ElasticSearch에서 차트와 그래프를 이용해 데이터를 시각화할 수 있게 해줍니다.Beats
는 서버의 에이전트로 설치하여 다양한 유형의 데이터를 ElasticSearch 나 Logstatsh 로 전송하는 오픈 소스 데이터 발송자입니다.
기본적인 시스템 아키텍처는 아래와 같다.
Beats에는 PacketBeat, FileBeat, MetricBeat, WinlogBeat 등 여러가지 Beat가 있다. 해당 Beat들이 각자의 역할로 Metric 정보나 윈도우 이벤트, 로그파일 정보들을 수집하여 ElasticSearch나 Logstash로 전달하게 됩니다.
필요 하다면 Logstash를 통해 가공 작업을 거쳐 ElasticSearch로 보내주고 이 결과를 Kibana로 보이게 됩니다.
Filebeats는
파일에 저장된 로그 파일을 실시간으로 수집
하여 Logstash로 전달해주는 서비스 입니다.(즉, 이는 데이터가 변경되면 실시간으로 전달해준다고 볼 수 있다.)그러나 꼭 Logstash로 안보내고 Elasticsearch로 바로 보낼수도 있다.
file -logstatsh로 바로 읽을 수 있으면 굳이 왜 FileBeat를 쓰나?
- filebeat는 logstash에서 파일 읽고 전송하는 기능만 있는 subset이라고 보면 되는데
- 데이터 출처(서버)가 여러 대인 경우 각각의 서버에 logstash를 설치해 운용하기에는 낭비가 심하기 때문
- 따라서 각 서버에는 경량 수집기 Filebeat만 설치하고, logstash는 소수의 장비에서 운용하기 위함
ELK 구현 및 프로젝트 적용
필자는 아래와 같은 아키텍처를 구현하였다.
- Spring Application 에서 log를 해당 폴더로 파일을 생성하고
- FileBeats에서 파일에 저장된 로그 파일을 수집합니다
- FileBeats -> Logstash 로 로그 파일을 전달
- Logstash에서 전달받은 log 파일들을 ElasticSearch로 전달
- Kibana에서 해당 log 파일을 모니터링 할 수 있다.
테스트 환경
- Windows10
- Spring
- elasticsearch-7.10.0
- filebeat-7.10.0
- kibana-7.10.0
- logstash-7.10.0
먼저 ElasticSearch, fileBeat, kibana, logstatsh를 설치한다.
logstash config 폴더의 logstash.conf 파일을 수정한다.
- input, filter, output으로 구성된다.
input
은 filebeat에서 받을 포트를 지정한다.output
은 logstash에서 받은 파일을 elasticsearch로 parse하기 위해 설정, index는 Kibana 인덱스에서 생성될 이름이다.\
input{ beats{ port => 5044 } } output{ elasticsearch { hosts => ["localhost:9200"] index => "logstash-%{+YYYY.MM.dd}" } }
Spring Application log를 수집할 filebeat의 filebeat.yml 파일 수정
# ============================== Filebeat modules ============================== filebeat.inputs: - type: log enabled: true paths: - "C:/home/jhc/logs/logenLog/info/*.log" //어플리케이션 로그가 찍히는 Path processors: - decode_json_fields: fields: ["message"] max_depth: 1 target: "filebeat" # ------------------------------ Logstash Output ------------------------------- output.logstash: hosts: ["localhost:5044"] //Logstash로 parse할 포트
filebeat log를 받을
logstash
먼저 실행한다. 명령어는 bin 폴더에서logstash -f ../config/logstash.conf
를 입력
console 창에 쭉 실행 되면서 위 이미지 마지막 줄 처럼 성공적으로 Logstash API 가 실행됬다고 출력된다.
logstash를 실행한 후 filebeat도 cmd창을 열어서 실행한다. 명령어는
filebeat -e
이다.정상적으로 실행이 되었다면 위의 이미지 처럼 실시간으로 log를 모니터링 한다.
차례로 elasticsearch를 실행, bin 폴더에서 cmd창을 키고
elasticsearch
입력 정상적으로 실행됬는지 확인 위해localhost:9200
입력
아래와 같은 Json 데이터 출력 됨
kibana도 실행 해준다, bin 폴더에서 kibana.bat 실행
위 과정을 모두 수행하면 cmd창 4개가 실행되고 있으며 localhost:5601로 접속하면 아래와 같은 Elastic 홈페이지로 이동
이제 Elastic의 index를 설정을 위해 메뉴에서 Management의 Stack Management 클릭
Kibana의 index Patterns 로 진입한다. 아래와 같은 index patterns을 등록 할 수 있다.
여기서 logstash 의 index 설정한
logstash-*
라고 입력하고 해당 날짜의 index를 생성합니다.Kibana의 Discover로 진입하면 아래와 같은 log를 볼 수 있다.
마치며
ELK Stack을 Spring 프로젝트와 연동 하였는데 현재는 info 폴더에 대한 log만 수집하고 있다. 추가로 error와 login 폴더에 있는 log도 함께 출력 할 예정이다.
데이터 시각화를 위해 조금 Filter와 데이터 가공을 통해 조금 더 공부 해 볼 예정이다.
참고
'Infra' 카테고리의 다른 글
[JenKins]젠킨스 Github 연동하기 (0) | 2023.06.18 |
---|---|
[Jenkins] 배포전략(Rolling, Canary, Blue/Green) (1) | 2023.06.14 |
Jenkins CI/CD 및 Pipeline 이해하기 (1) | 2023.05.16 |
- Total
- Today
- Yesterday
- spring mvc
- lock
- jenkins
- 논블로킹
- Spring Security
- mysql
- 인덱스
- spring boot
- GIS
- github
- DispatcherServlet
- 스프링
- R-Tree
- spring
- database
- 네트워크
- 쓰레드
- 공간쿼리
- java
- TCP
- 데이터베이스
- thread
- 다운로드
- 영속성 컨텍스트
- oauth2
- db
- Excel
- Index
- jpa
- 비동기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |