우아한테크코스/레벨3
Elastic Stack 적용하기
nauni
2021. 8. 12. 20:48
Elastic Stack
- ELK: Elasticsearch, Logstash, Kibana
- Elasticsearch: 검색 및 분석엔진
- Logstash: 서버 사이드 데이터 처리 파이프라인, 여러 소스의 데이터를 수집하여 변환한 뒤 elasticsearch 에 전송
- Kibana: Elasticsearch 의 내용을 차트와 그래프를 이용해 데이터를 시각화
- Beats: 경량의 단일 목적 데이터 수집기 제품군
- Elastic Stack: ELK + Beat
ELK 설치하기
- 프로젝트를 하면서는 별도의 EC2에 docker 에 설치하였다.
- elk docker 설치 참고 레포짓토리
- elk 서버에 logstash, elasticsearch, kibana 를 설치
- logstash, kibana 는 elasticsearch 에 의존성을 가진다.
Logstash
- filebeat 에서 로그를 받아 filter 로 분석하기
input {
beats {
port => 포트번호
}
tcp {
port => 포트번호
}
}
filter {
# backspace 제거: 정형화된 로그가 아니다 보니 \b 부분이 문제가 되었는데 없애줌
mutate {
gsub => ["log","[\b]", ""]
}
# grok 을 사용하여 원하는 방식대로 로그를 filter
# grok 문법을 사용하며, log 필드에 들어온 값을 정규표현식과 비슷하게 파싱하여 json 형태로 보내준다.
# %{해당패턴:필드로_묶을_이름:자료형} -> 필드로 묶을 이름을 지정하지 않으면 해당패턴 명으로 묶인다.
grok {
match => {"log" => ["Epoch %{NUMBER:currentEpoch:int}\/%{NUMBER:totalEpoch:int}
%{GREEDYDATA}- loss: %{NUMBER:loss:float} - accuracy: %{NUMBER:accuracy:float}"] }
}
# jobId를 태그로 관리: [] 방식으로 json 경로의 key 접근가능
mutate {
rename => {"[attrs][tag]" => "jobId"}
}
}
output {
elasticsearch {
hosts => 엘라스틱 포트
# .. 각종 설정정보 넣어줌 ..
# index 는 job 으로 클러스터링
index => "job"
}
}
FileBeat
- 로그가 있는 서버에 설치
- Beats 의 제품군에는 여러가지가 존재하는데 그 중 로그파일 전용이 Filebeat
filebeat.inputs:
- type: log
# 도커 컨터이너로부터 쌓이는 로그의 경로 설정
paths:
- '/var/lib/docker/containers/*/*.log'
# docker 의 로그는 json 형태로 쌓이는데 json.message_key 는 해당 key 에 해당하는 정보를 위로 올려준다.
# 각 항목이 정확이 무얼 의미하는지 모르지만, docker 의 json 형태의 로그에서 생기는 문제를 풀어주는 역할을 했다.
json.keys_under_root: true
json.overwrite_keys: true
json.add_error_key: true
json.expand_keys: true
json.message_key: log
# 로그를 한줄한줄이 아닌 원하는 패턴의 단위로 묶어서 보내줄 수 있다.
multiline.type: pattern
multiline.pattern: '^Epoch'
multiline.negate: true
multiline.match: after
# default 는 5초로 셋팅되어 있다. 묶어주는 로그 단위가 크면 중간에 의도한대로 나오지 않고 짤렸기 때문에 늘려주었다.
multiline.timeout: 30
output.logstash:
hosts: [로그스태시의 호스트 IP & PORT]
Kibana
- 실제 kibana 를 사용하여 로그를 시각화 하지는 않았고, 프론트엔드 팀원들이 해주었다.
- kibana 는 elastic 에서 API 를 통해 봐야하는 로그정보들을 쉽게 시각화 해준다.
ElasticSearch
- SpringBoot 를 사용한다면 의존성 추가로 쉽게 적용이 가능하다.
- gradle 설정에서
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
를 추가 - Java 에서 Repository 처럼 쉽게 사용이 가능하다.
- Config 설정을 해준다.
@Configuration
public class ElasticClientConfig extends AbstractElasticsearchConfiguration {
@Override
@Bean
public RestHighLevelClient elasticsearchClient() {
final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(host)
.withBasicAuth(userName, password)
.build();
return RestClients.create(clientConfiguration).rest();
}
}
- ElasticsearchRepository 를 상속받아 Repository 처럼 사용가능하다.
public interface LogRepository extends ElasticsearchRepository<Log, String> {
List<Log> findByJobIdOrderByTime(Long jobId);
}
적용
- docker 에서 실행하며 쌓이는 로그를 파싱하여 읽어오기 위해 사용하였다.
- 모듈화된 로그가 아니라 원하는 형태로 로그를 보내고 파싱하는 부분에서 설정을 하며 많은 시도를 하였다.
- 기존 모듈화 되지 않은 로그를 분석하는데 사용하였지만 elasticsearch 는 검색엔진으로 사용될 때 큰 빛을 발하는 듯 하다.
- filebeat 에는 다양한 모듈이 존재하여(nginx, mysql 등) 쉽게 로그를 추출할 수 있는 듯 하다.
느낀점
- docker 환경 설정을 하느라 docker 공부를 하게 되었다.
- CLI 환경에 조금 더 익숙해졌다.
- 각각의 역할이 나눠져 있어 어떤 환경에서 이슈가 생기는지 파악하기 다소 어려웠다.
- EC2 서버 설정 환경등 고려해야할 요소들이 많았다.