개요
ELK는 Elasticsearch, Logstash, Kibana의 약자로, 이들 소프트웨어를 함께 사용하여 로그 데이터를 수집, 저장, 시각화하는데 사용되는 오픈 소스 스택을 가리킵니다.
- Elasticsearch:
- 용도: Elasticsearch는 실시간 분석을 위한 분산 검색 및 분석 엔진입니다.
- 기능: 대용량의 데이터를 안정적으로 저장하고, 신속하게 검색 및 집계할 수 있습니다.
- 활용: 로그, 지표, 트랜잭션 등의 다양한 유형의 데이터를 색인화하고 검색하는 데 사용됩니다.
- Logstash:
- 용도: Logstash는 다양한 소스에서 로그 데이터를 수집하고, 변환하며, Elasticsearch 또는 다른 저장소로 전송하는 역할을 합니다.
- 기능: 다양한 입력 소스로부터 데이터를 수집하고, 그 데이터를 필터링, 변환, 가공한 후, 목적지로 전송합니다.
- 활용: 다양한 형식의 로그 데이터를 통합하여 표준화된 형태로 Elasticsearch로 전송하여 분석하거나 저장합니다.
- Kibana:
- 용도: Kibana는 Elasticsearch에 저장된 데이터를 시각화하고 대시보드를 만들 수 있는 웹 인터페이스입니다.
- 기능: Elasticsearch에서 검색된 데이터를 그래프, 차트, 맵 등 다양한 시각적 형태로 표현할 수 있습니다.
- 활용: 로그 데이터의 추세, 이벤트, 경고 등을 실시간으로 모니터링하고 분석할 때 사용됩니다.
ELK 스택을 이용하면 다음과 같은 시나리오를 구축할 수 있습니다:
- Logstash를 사용하여 다양한 소스에서 로그 데이터를 수집하고 필터링합니다.
- 필터링된 데이터를 Elasticsearch로 전송하여 안정적으로 저장하고 인덱싱합니다.
- Kibana를 사용하여 Elasticsearch에 저장된 데이터를 시각화하고 대시보드를 생성하여 모니터링 및 분석합니다.
ELK 스택은 특히 대규모 환경에서 발생하는 로그 데이터를 효과적으로 관리하고 분석하는 데 유용하며, 시스템 및 응용 프로그램의 성능 모니터링, 로그 분석, 보안 모니터링 등 다양한 용도로 활용됩니다.
도커(Docker)는 컨테이너 기반의 가상화 플랫폼으로, 응용 프로그램을 개발, 배포 및 실행하기 위한 오픈 소스 기술입니다. 도커는 애플리케이션과 그에 필요한 모든 종속성을 컨테이너로 패키징하여 이식성이 뛰어난 환경을 제공합니다. 이러한 컨테이너는 호스트 시스템과 독립적으로 실행되며, 다양한 환경에서 일관된 실행을 보장합니다.
도커의 주요 특징과 개념은 다음과 같습니다:
- 이식성(Portability): 도커 컨테이너는 어떤 환경에서도 실행될 수 있도록 모든 필요한 라이브러리, 종속성, 환경 변수 등을 포함합니다.
- 경량성(Lightweight): 도커는 가상 머신에 비해 훨씬 가볍고 빠르며, 호스트 시스템에서 리소스를 효율적으로 사용합니다.
- 빠른 배포(Deployment): 도커 컨테이너는 이미지로 미리 패키징되어 있으며, 이를 사용하여 애플리케이션을 빠르게 배포하고 확장할 수 있습니다.
- 확장성(Scalability): 도커는 여러 호스트에서 컨테이너를 실행하고 관리할 수 있어, 애플리케이션의 확장이 용이합니다.
- 버전 관리(Versioning): 도커 이미지는 버전으로 관리되며, 변경 사항을 쉽게 추적하고 롤백할 수 있습니다.
설치 및 사용
아래의 순서로 진행하도록 하겠습니다.
- Windows 환경에 Docker를 설치
- Docker에서 ELK를 실행
- Spring boot에서 Logstash 사용
- Kibana에서 로그를 확인
1. Windows 환경에 Docker를 설치
Docker 사이트에서 Windows용을 다운로드 받습니다.
Docker 계정이 없으면 생성합니다. 저는 계정이 이미 존재하기 때문에 해당 과정은 넘어가도록 하겠습니다.
다운로드가 완료된 파일을 실행하면 아래와 같은 창이 뜨게 됩니다.
Ok 버튼을 클릭하면 Docker 설치가 진행됩니다.
설치가 완료되면 재부팅이 필요합니다. Close and restart를 눌러 재부팅을 합니다.
재부팅을 하면 아래와 같은 창이 뜨고 Accept를 눌러 줍니다.
기본으로 선택되있는 상태 그대로 Finish를 클릭 합니다.
Docker Desktop이 열리는 것으로 Docker 설치가 완료되었습니다.
로그인을 하면 아래의 화면이 나오는데 적절하게 선택 후 Continue를 눌러 줍니다.
Windows에서 docker를 관리할 수 있는 화면이 뜨게 됩니다.
cmd에서 docker -v 명령어를 통해 설치가 정상적으로 되었는지 확인해봅니다.
2. Docker에서 ELK를 실행
이제 Docker에서 ELK를 실행하도록 하겠습니다.
Docker-compose를 사용하면 Elasticsearch, Logstash, Kibana 각각의 개별 컨테이너를 묶어서 관리하기 수월해집니다.
Docker Compose는 여러 개의 독립적인 Docker 컨테이너를 사용하여 애플리케이션을 쉽게 관리하고 배포하기 위한 도구입니다. Docker Compose를 사용하면 여러 컨테이너로 구성된 복잡한 애플리케이션을 정의하고 실행하는 데 도움이 됩니다.
윈도우의 경우 Docker를 설치하면 Docker Compose도 같이 설치되게 됩니다. cmd에서 docker-compose -v 명령어를 입력하면 설치가 되었음을 확인할 수 있습니다.
각각 최신 버전은 Docker hub 홈페이지에서 조회할 수 있습니다. 현재 Elasticsearch, Logstash, Kibana의 최신 버전은 8.12.0인데 8버전으로 설정을 해보려니 Elasticsearch 8버전부터 보안 기능이 변경되었는데 해당 설정이 잘 안되서 7버전으로 사용했습니다.
compose.yml 파일을 아래와 같이 작성합니다. 이 파일은 애플리케이션의 서비스, 네트워크, 볼륨 및 기타 구성을 정의하는 데 사용됩니다.
networks:
elk:
driver: bridge
services:
# Elastic search 설정
elasticsearch:
container_name: elasticsearch
image: elasticsearch:7.17.16
ports:
- 9200:9200
- 9300:9300
volumes:
- ./elasticsearch:/usr/share/elasticsearch/data
# Elastic search 계정정보
environment:
discovery.type: single-node
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
ELASTIC_USERNAME: "elastic"
ELASTIC_PASSWORD: "elastic123!@#"
networks:
- elk
# Logstash 설정
logstash:
container_name: logstash
image: docker.elastic.co/logstash/logstash:7.17.16
ports:
- 5000:5000
- 9600:9600
volumes:
- ./logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
depends_on:
- elasticsearch
networks:
- elk
# Kibana 설정
kibana:
container_name: kibana
image: kibana:7.17.16
ports:
- 5601:5601
depends_on:
- elasticsearch
volumes:
- ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
networks:
- elk
- networks: Docker Compose 파일의 맨 처음에 정의된 부분으로, 여기에서 "elk"라는 이름의 Docker 네트워크를 생성하고 설정합니다. "bridge"라는 드라이버를 사용하여 브리지 네트워크를 만듭니다.
- services: 각 서비스의 설정을 정의합니다.
- elasticsearch: Elasticsearch 서비스의 설정입니다.
- container_name: 컨테이너의 이름을 "elasticsearch"로 지정합니다.
- image: 사용할 Elasticsearch 도커 이미지를 지정합니다.
- ports: 호스트와 컨테이너 간의 포트 매핑을 정의합니다. Elasticsearch는 9200 및 9300 포트를 사용합니다.
- volumes: 호스트와 컨테이너 간의 데이터 볼륨 매핑을 설정합니다.
- environment: Elasticsearch 컨테이너에 전달되는 환경 변수를 설정합니다. 여기에서는 Elasticsearch의 계정 정보와 보안 설정을 지정합니다.
- networks: "elk" 네트워크에 연결합니다.
- logstash: Logstash 서비스의 설정입니다.
- container_name: 컨테이너의 이름을 "logstash"로 지정합니다.
- image: 사용할 Logstash 도커 이미지를 지정합니다.
- ports: 호스트와 컨테이너 간의 포트 매핑을 정의합니다. Logstash는 5000 및 9600 포트를 사용합니다.
- volumes: 호스트와 컨테이너 간의 데이터 볼륨 매핑을 설정합니다. 여기에서는 Logstash의 파이프라인 설정 파일을 지정합니다.
- depends_on: Logstash 컨테이너가 Elasticsearch 컨테이너에 의존함을 명시합니다.
- networks: "elk" 네트워크에 연결합니다.
- kibana: Kibana 서비스의 설정입니다.
- container_name: 컨테이너의 이름을 "kibana"로 지정합니다.
- image: 사용할 Kibana 도커 이미지를 지정합니다.
- ports: 호스트와 컨테이너 간의 포트 매핑을 정의합니다. Kibana는 5601 포트를 사용합니다.
- volumes: 호스트와 컨테이너 간의 데이터 볼륨 매핑을 설정합니다. 여기에서는 Kibana의 설정 파일을 지정합니다.
- depends_on: Kibana 컨테이너가 Elasticsearch 컨테이너에 의존함을 명시합니다.
- networks: "elk" 네트워크에 연결합니다.
- elasticsearch: Elasticsearch 서비스의 설정입니다.
이러한 설정을 사용하여 ELK 스택의 각 구성 요소를 컨테이너로 실행하고 서로 통신하도록 설정합니다.
kibana.yml 파일을 작성합니다. 이 파일은 Kibana 서비스를 구성하는 설정 파일입니다.
# 키바나 설정파일
server.name: kibana
server.host: "0"
# Elasticsearch 서버 정보
elasticsearch.hosts: http://elasticsearch:9200
elasticsearch.username: "elastic"
elasticsearch.password: "elastic123!@#"
이러한 설정은 Kibana가 올바르게 동작하고 Elasticsearch와 통신할 수 있도록 합니다.
logstash.conf 파일을 작성합니다. 이 파일은 Logstash 서비스를 구성하는 설정 파일로, Logstash가 데이터를 수집, 변환 및 전송하는 파이프라인을 정의합니다. 이 파일은 입력(Input), 출력(Output)으로 구성되어 있습니다. output의 index를 기준으로 kibana에서 로그를 모니터링 하게 됩니다.
input {
tcp {
port => 5000
codec => json_lines
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
user => "elastic"
password => "elastic123!@#"
index => "logstash-%{+YYYY.MM.dd}"
}
}
작성한 각 파일을 아래의 구조로 배치해줍니다.
compose.yml
logstash
-pipeline
--logstash.conf
kibana
-config
--kibana.yml
저는 docker라는 폴더를 만들어서 배치해줬습니다.
cmd로 해당 파일을 배치한 폴더에서 docker compose up 명령어를 입력해줍니다. 해당 명령어는 Docker Compose에 정의되어 있는 모든 서비스 컨테이너를 한번에 생성하고 실행합니다. (백그라운드 실행을 하려면 docker compose up -d 명령어를 실행해주면 됩니다.)
Elasticsearch, Logstash, Kibana 설치가 완료되고 http://localhost:5601(kibana)에 접속하면 아래의 화면을 확인할 수 있습니다.
3. Spring boot에서 Logstash 사용
Spring boot에서는 기본적으로 Logback을 사용해서 로그를 쌓고 있는데 Logback에서 쌓는 로그를 Logstash가 이해할 수 있게 하기 위해서 logstash-logback-encoder을 사용하면 됩니다. 해당 인코더는 Logback을 통해 로그 이벤트를 Logstash가 이해할 수 있는 형식으로 인코딩하는 역할을 합니다.
build.gradle 파일에 아래의 dependency를 추가해줍니다.
implementation 'net.logstash.logback:logstash-logback-encoder:7.4'
logback-spring.xml 파일에 LogstashAppender를 추가해주고 해당 Appender를 사용하는 logger를 추가해줍니다.
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- 로그 스태시 주소 -->
<destination>localhost:5000</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
</encoder>
</appender>
<logger name="INFO_LOG" level="DEBUG">
<appender-ref ref="LOGSTASH"/>
</logger>
logger를 사용해서 로그를 남깁니다.
Log logger_info = LogFactory.getLog("INFO_LOG");
logger_info.debug("로그입니다~~~");
이제 kibana에서 로그를 확인하기 위해 kibana에서 좌측메뉴의 Analytics > Discover를 클릭 합니다.
Elasticsearch에 data가 쌓여있고 index pattern을 생성하라는 화면이 나옵니다.
Create index pattern을 클릭 합니다.
우측의 Index Name이 선택될 수 있게 Name을 정하고 Timestamp field를 @timestamp로 선택합니다. @timestamp는 로그스테이시에서 전처리를 거친(Timezone 설정을 한) 날짜 데이터입니다. 그리고 Create index pattern을 클릭합니다.
다시 Discover 페이지에 진입하면 아래와 같이 로그를 확인할 수 있습니다.
참고자료
'개발 > Docker' 카테고리의 다른 글
[Docker] [Kafka] cluster 구성하는 방법 (0) | 2024.02.23 |
---|---|
[Docker] [Spring Boot] [Kafka] [ELK] 다른 Docker Container 간 통신 (0) | 2024.02.14 |
[Docker] Docker에서 Kafka 실행하기 (0) | 2024.02.13 |
[Docker] Dockerfile와 docker compose 파일의 차이 (1) | 2024.02.13 |
[Docker] elasticsearch exited with code 137 에러 해결 (0) | 2024.01.23 |