
ElasticSearch + Logstash + Kibana 의 약어로, 로그 수집을 위해 오픈소스 툴들을 이용해 만든 아키텍처의 일환입니다.
서버에서 발생하는 로그들을 수집해 더욱 효율적으로 확인하기 위한 모니터링 스택의 일종으로, 로컬에서 ELK 스택을 구축하는 실습을 진행해보겠습니다.
아래 코드를 통해 elasticsearch를 설치하고 압축을 해제해줍니다.
# Elasticsearch 설치
curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.3-darwin-x86_64.tar.gz
curl https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.3-darwin-x86_64.tar.gz.sha512 | shasum -a 512 -c -
# Elasticsearch 압축 해제
tar -xzf elasticsearch-8.14.3-darwin-x86_64.tar.gz
cd elasticsearch-8.14.3/
# Elasticsearch 실행
./bin/elasticsearch
elasticsearch를 처음 실행하면 다음과 같이 주요 정보들을 확인할 수 있습니다.
password나 키바나 연동 토큰은 이후 작업에서 사용되니 따로 메모해둡시다!

기본적으로 elasticsearch는 https를 이용해 통신하기 때문에, 로컬에서 테스트할 분들은 config/elasticsearch.yml를 아래와 같이 변경해줍니다.
xpack.security.enabled: false
xpack.security.http.ssl.enabled: false
xpack.security.transport.ssl.enabled: false
아래 링크를 통해 Logstash를 설치 후 압축을 해제합니다.
https://www.elastic.co/kr/downloads/logstash
config 폴더에 logstash.conf라는 이름의 설정 파일을 생성해줍니다.
cd /logstash-9.1.2
# config 파일 생성
vi config/logstash.conf
logstash.conf는 logstash의 입력과 출력에 대한 세부 설정을 명시해주는 파일입니다. 5001포트로 tcp를 이용해 데이터를 수집하고, 이를 elasticsearch로 보낸다는 내용이죠.
만약 앱에서 filebeat를 이용해 로그를 수집한 후 logstash로 보낼 경우, input에 tcp {}가 아닌 beats {}를 이용하면 됩니다.
input {
tcp {
port => 5001
codec => json_lines
}
}
output {
elasticsearch {
hosts => ["localhost:9200"] # elasticsearch host, port num
index => "logstash-log"
user => "elastic"
password => {elastic_pwd}
}
stdout {} # 모니터링용으로 console에 출력함
}
변경사항을 logstash의 파이프라인에 올바르게 적용하기 위해, pipelines.yml에 아래 코드를 추가해줍니다.
- pipeline.id: springboot-logstash
queue.type: persisted
path.config: config/logstash.conf
이제 서비스 단에서 로그를 Logstash로 전송하는 기능을 구현해봅시다.
logback custom을 위한 의존성을 추가해줍니다.
implementation("net.logstash.logback:logstash-logback-encoder:7.4")
우선, 앞서 설정한 logstash의 host, port 정보를 application-secret.yml에서 관리하겠습니다.
springboot와 logstash는 tcp를 이용해 통신하므로, host 정보에 추가적으로 http://와 같은 다른 프로토콜을 등록하면 오류가 발생합니다.
logstash:
host: localhost:5001
/resources 폴더에 logback-spring.xml 이라는 이름의 파일을 생성해줍니다.
보통 logback 커스텀 파일명은
logback.xml으로 지정하지만, 아래 보시는 것처럼springProperty를 이용할 경우, 파일명에 반드시-spring이 붙어야 합니다.
spring 관련 값을 불러오기 전에logback.xml파일을 먼저 읽기 때문에, 올바른 값을 넣지 못해 태그를 해석할 수 없어 오류가 발생합니다. 하지만 파일명에-spring을 넣게 되면, 바로 logback에 넘기지 않고application.yml에서 관련 값을 찾아 넣고 실행하기 때문에 오류를 방지할 수 있습니다!
<configuration>
<!--application.yml에서 목적지 주소 관리-->
<springProperty scope="context" name="LOGSTASH_HOST" source="logstash.host"/>
<!--인덱스로 추가할 서비스명-->
<springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--로그 수집 후 출력할 주소-->
<destination>${LOGSTASH_HOST}</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<!--커스텀해 키바나에서 추가적으로 확인할 필드-->
<customFields>{"index":"${APP_NAME}"}</customFields>
</encoder>
</appender>
<!-- logging level -->
<root level="WARN">
<appender-ref ref="LOGSTASH" />
</root>
</configuration>
아래 명령어를 이용해 Kibana를 설치하고 압축을 해제합니다.
# Kibana 설치
curl -O https://artifacts.elastic.co/downloads/kibana/kibana-8.14.3-darwin-x86_64.tar.gz
curl https://artifacts.elastic.co/downloads/kibana/kibana-8.14.3-darwin-x86_64.tar.gz.sha512 | shasum -a 512 -c -
# Kibana 압축 해제
tar -xzf kibana-8.14.3-darwin-x86_64.tar.gz
cd kibana-8.14.3/
## Kibana 실행
./bin/kibana
localhost:5601 으로 접속하면 아래와 같은 키바나 화면을 마주할 수 있습니다.
elasticsearch로부터 얻은 키바나 연동 토큰을 입력해줍니다.

토큰 입력을 완료하면, 키바나 서버 콘솔에 인증 코드가 나타납니다. 이 코드를 입력해줍니다.


이후, elasticsearch를 처음 시동해서 얻은 비밀번호를 이용해 로그인하면, 두 스택의 연동이 완료됩니다!


Kibana에서 Elasticsearch로부터 들어온 로그를 확인할 수 있도록 Data View를 생성해줍니다.

index pattern에는 logstash config에 작성한 인덱스명을 작성해줍니다.

설정을 마치면, discover 탭에서 아래와 같이 내가 설정한 로그들을 한 눈에 대시보드로 파악할 수 있습니다!

Reference
https://kghworks.tistory.com/204
https://tech.ktcloud.com/255