Spring + Kotlin + Elastic Stack으로 로깅시스템 구축해보기

 

개념

 

ELK란 Elasticsearch, Logstash, Kibana, Beats 등의 스택들로 구성되어 시너지 효과를 내는 기술스택을 말한다.

 

 

ElasticSearch

 

 실시간 데이터 검색, 분석을 위한 분산형 데이터 저장/검색 엔진으로, 일종의 데이터베이스 시스템이다. 쉽게 말해서 여러 문서(파일) 등에서 특정 문자열을 검색하는 역할을 한다고도 할 수 있다.

 

 

rdb와 유사한 역할을 하는데, 데이터를 색인화하여 빠르게 검색, 분석할 수 있도록 도와주며, 실시간 데이터를 처리해주는 역할을 주로 하며, RDB와 다르게 해쉬테이블로 되어있어 O(1)의 조회성능이 나온다. 위 표는 rdb와 elasticsearch의 용어 대응을 보여주는데, 개인적으로는 꽤 많은 차이를 보이지만 조금이라도 이해를 도울 수 있을 것 같다.

 

https://www.devkuma.com/docs/elasticsearch/intro/

 

- 필드(field, =column)

 key-value쌍으로 나타나며, 각각의 key는 text, date 등의 유형(type)을 가진다.

- 도큐먼트(document, =row)

 rdb의 row와는 좀 다른데, key-value쌍인 field가 모여서 구성하는 일종의 파일을 말한다.

- 색인(index, =database)

 도큐먼트들의 집합을 말한다. 도큐먼트가 파일이라고 했으므로, 일종의 폴더로 볼 수 있다.  

- 매핑(mapping, =schema)

 필드의 key마다 type을 갖는다고 했는데, 이러한 정보들을 정의해놓은 schema라고 볼 수 있으며, index당 하나 존재한다.

 

 

Kibana

 

 

 분석 및 시각화 플랫폼으로, ElasticSearch의 데이터를 차트 등으로 시각화하는데 사용된다.

Kibana에서 시각화를 하기 위해서는 Elasticsearch의 Index에 연결되어 있어야 하며, Index Pattern에 맞추어 데이터를 가져온다. 

 

- Index Pattern

 Index 매핑 정보를 Kibana에서 사용하기 적합하게 미리 캐싱해둔 것이다. 여러개의 인덱스에 대한 메타데이터를 병합하여 저장했다가 검색/시각화 생성시 활용한다.

 

 

 

 

Logstash

 

 애플리케이션의 로그를 처리하고 이를 ElasticSearch로 보내는데 사용되는 데이터 처리 파이프라인이다.

 input plugin(Logstash가 이벤트를 수신하는 방식)과 filter plugin(Logstash가 이벤트를 처리하는 방식)을 지정해줄 수 있다. filter plugin으로 Json을 사용하여 받아서 처리해주면 될 것 같다. 또한 데이터베이스에 무관하게 동작한다.

 

 

Spring Data ElasticSearch

 Spring Data ES는 Elasticsearch 검색엔진을 사용하는 솔루션 개발을 도와주는 모듈이다. Spring Data JPA가 Repository를 컴포넌트로 등록해주고, 인터페이스 명명규칙에 따라서 내부적으로 JPQL을 생성해서 쿼리를 날려주는 것처럼, Spring Data ES도 Repository 인터페이스에 메서드를 정의함으로써 쿼리를 표현할 수 있다.

 

 

Spring Data ElasticSearch vs Rest High Level Client

 Spring Data ES는 ORM을 지원하기 때문에 객체의 형태로 ES와 상호작용할 수 있으며, 별도의 쿼리빌더를 생성하지 않아도 되어 보일러 플레이트 코드를 줄일 수 있다. Rest High Level Client는 대신 버전에 민감하지 않다는 장점을 갖는다. 참고로 Spring Data ES도 내부적으로 Rest High Level Client를 사용한다고 하니, Spring Data ES가 내부적으로 쿼리를 생성해주는 것으로 추측할 수 있다.

 

 

 

 

로깅 시스템 구상

(1) 클라이언트에서 로그 api를 json형태로 전송하면, 서버에서 받아서 로그를 logstash에 저장한다.

(2) logstash에서는 로그를 받아서 로그 레코드를 정제하여 elasticsearch에 저장한다.

(3) elasticsearch에 저정된 로그들은 kibana를 통해서 시각화된 분석이 가능하다.

(4) elasticsearch에 저장된 로그는 curator를 사용하여 오래된 로그를 자동으로 지워준다.

 

-> 인스턴스 비용 문제로 logstash를 현재 프로젝트에서 실행하기가 어렵다는 결론이 나와, 스프링부트에서 바로 es를 통해서 kibana로 시각화하는 것으로 결정했다.

 

 

실습 환경

- elasticsearch/logstash/kibana: 8.11.3

- java 17, spring 3.2.1

 

 

실습

A. ElasticSearch 실행

 

1. elasticsearch 홈페이지(https://www.elastic.co/kr/downloads/past-releases#elasticsearch)에서 원하는 버전 설치후 압축 해제

 

2. 터미널에서 폴더내의 ./bin/elasticsearch 파일 실행

 

만약 위와 같은 오류가 발생한다면 config/elasticsearch.yml에서 xpack 관련 보안옵션 4가지를 false로 설정해주면 된다.

 

xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl: enabled: false
xpack.security.transport.ssl: enabled: false

 

local이 아니라 실제 운영시에는 ssl을 적용해주어야 하는 것 같음. (https://logical-code.tistory.com/215)

 

3. elasticsearch 실행 확인

localhost:9200으로 접속하면 elasticsearch 실행을 확인할 수 있다.

 

4. elasticsearch에서 제공하는 Rest API를 이용하여 데이터를 관리할 수 있다.

참고: elastic 가이드북(https://esbook.kimjmin.net/04-data)

 

 

 

 

 

B. Logstash 실행

 설치파일을 받은 후, Logstash 설치 디렉터리 밑에 config/logstash-sample.conf 파일을 수정하자.

 

 

input을 수정하여 수집할 데이터소스를 지정하고, output을 통해서 데이터를 elasticsearch로 전송할 수 있다.

 

이후 설치경로 밑의 bin 디렉토리로 이동하여 ./logstash.bat -f logstash-sample.conf 과 같이 -f옵션으로 설정한 configuration 파일을 넘겨주면 된다.

 

 

C. Kibana 실행

 키바나는 받은 압축파일을 풀고, 파일경로 밑의 bin 디렉토리에 있는 kibana파일을 실행시켜주기만 하면 된다.

 

 

 

 

@. brew 설치 시도 -> 사용하지 않음

 

 

내내 이런 오류가 발생하여 설치하지 못함 (구글링해도 동일 오류가 나오지 않음) -> homebrew관련 문제로 생각하고 일단 포기

했는데 계속 살펴보다 발견한 글: https://github.com/elastic/homebrew-tap/issues/146

 

 

-> elasticache의 경우 해결했으나, logstash와 kibana를 brew install로 설치 시도시 똑같은 오류가 발생하여 포기

 

추가) 공식 가이드에서 다음과 같은 글을 찾았다.

https://www.elastic.co/guide/en/logstash/current/brew.html

 

Logstash 8.0부터는 homebrew cask를 지원하지 않는것 같다.

-> 직접 설치파일을 다운받아서 실행해주어야 하는것을 권장하고 있다. 

 

 

 

참고자료

https://www.devkuma.com/docs/elasticsearch/intro/

https://www.slideshare.net/deview/2d1elasticsearch

https://yeo0.tistory.com/entry/Kibana-%ED%82%A4%EB%B0%94%EB%82%98-%EA%B8%B0%EB%B3%B8%EA%B0%9C%EB%85%90-Index-Pattern-Discover-Visualize-Dashboard

 

github

https://github.com/yourssu/YLS-Backend

 

GitHub - yourssu/YLS-Backend: Yourssu Logging System for Backend

Yourssu Logging System for Backend. Contribute to yourssu/YLS-Backend development by creating an account on GitHub.

github.com