Logstash
- Elastic Stack의 중요한 구성 요소 중 하나로 로그 및 이벤트 데이터를 수집, 변환, 저장하는 데이터 처리 파이프라인
- 다양한 소스에서 데이터를 수집하여 Elasticsearch와 같은 저장소로 전송하기 전에 데이터를 필터링 및 변환하는 데 사용
- 다양한 데이터소스를 쉽게 연동할 수 있는 기능 제공
- Elasticsearch와의 연동이 잘 되어있기 때문에 로그 수집을 해서 분석, 모니터링 하는데까지 용이하게 사용 가능
Logstash 특징
1. 플러그인 기반
- 로그스태시의 파이프라인을 구성하는 각 요소들은 전부 플러그인 형태로 만들어져 있음
- 기본으로 제공되는 플러그인 외에도 수많은 써드 파티 플러그인을 찾을 수 있으며 정말 필요한 경우 비교적 간단한 코드로 전용 플러그인을 작성해 로그스태시의 다른 모든 장점을 가져가면서 고유한 로직을 포함시킬 수 있음
- 이를 위해 플러그인 개발을 위한 프레임워크를 포함하고 있고 플러그인을 관리할 수 있는 기능도 제공
2. 모든 형태의 데이터 처리
- 기본 제공되는 플러그인들의 조합만으로도 대다수의 데이터 소스에서 JSON, XML 등의 구조화된 텍스트 뿐만 아니라 다양한 형태의 데이터를 입력받아 가공한 다음 저장 가능
- 특히 이벤트 데이터, 즉 시간에 따라 발생하는 데이터를 처리하는데 최적화되어 있음
3. 성능
- 자체적으로 내장되어 있는 메모리와 파일 기반의 큐를 사용하므로 처리 속도와 안전성이 높음
- 인덱싱할 도큐먼트의 수와 용량을 종합저긍로 고려해 벌크 인덱싱을 수행할 뿐만 아니라 파이프라인 배치 크기 조정을 통해 병목현상을 방지하고 성능 최적화 가능
4. 안전성
- Elasticsearch의 장애 상황에 대응하기 위한 재시도 로직이나 오류가 발생한 도큐먼트를 따로 보관하는 dead letter queue를 내장하고 있음
- 파일 기반의 큐를 사용할 경우 뜻하지 않은 logstash의 장애 상황에서도 도큐먼트 유실을 최소화할 수 있음
Logstash 파이프라인
1. 데이터 수집(input)
- Logstash는 여러 소스(파일, DB, 메시징 큐, HTTP, syslog 등)에서 데이터를 수집할 수 있음
- 다양한 플러그인(input plugins)을 사용하여 데이터 소스와 연결
- ex) file, tcp/udp, kafka, beats, etc.
2. 데이터 변환(filter)
- 수집된 데이터를 변환하거나 필터링할 수 있음
- 복잡한 변환 작업을 수행하여 원시 데이터를 구조화된 형식으로 변환
- ex) grok, mutate, drop, clone, geoip, date, etc.
3. 데이터 출력(output)
- 변환된 데이터를 Elasticsearch, 파일, DB, 메시징 큐, HTTP endpoint 등 다양한 목적지로 전송 가능
- 다양한 출력 플러그인(output plugins)을 사용하여 데이터 전달
- ex) Elasticsearch, file, http, kafka, etc.
4. Codec Plugin
- 입력 또는 출력의 일부로 작동할 수 있는 스트림 필터로 입력과 출력에서 데이터를 인코딩하거나 디코딩
- 직렬화할 때 메시지 전송을 쉽게 분리 가능
- ex) json, plain, line, etc.
5. 데이터 처리 파이프라인
- Logstash는 입력(input), 필터(filter), 출력(output)으로 구성된 파이프라인을 통해 데이터 처리
- 각 파이프라인은 여러 개의 플러그인을 사용할 수 있으며 플러그인 간 데이터가 흐르도록 구성 가능
5.1 주요 파이프라인
input
- file, csv, http, tcp, s3, beats, twitter, kafka, etc.
- https://www.elastic.co/guide/en/logstash/current/input-plugins.html
filter
- grok: 구조화되지 않은 로그 데이터를 분석하고 구조화
- dissect: 간단한 패턴을 사용해 메시지를 구조화된 형태로 분석, 정규식을 사용하지 않아 grok에 비해 자유도는 조금 떨어지는 편
- mutate: 변형
- drop: 삭제
- clone: 복사본 만들기
- https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
output
- elasticsearch, file, datadog, google_bigquery, redis, email, etc.
- https://www.elastic.co/guide/en/logstash/current/output-plugins.html
codec
- json: JSON으로 인코딩/디코딩
- multiline: 여러줄의 메시지를 하나의 이벤트로 합치기
5.2 grok 사용법
- 5.1 주요 파이프라인에서 소개한 filter 중 하나로 로그 데이터와 같은 비구조화된 데이터를 구조화된 데이터로 변환하는데 유용한 파서
- Grok 패턴은 정규 표현식을 사용하여 텍스트에서 원하는 정보를 추출하는 방법이며 logstash 필터에서 주로 사용
- %{SYNTAX:SEMANTIC} 형식을 따름
- SYNTAX는 패턴 이름
- SEMANTIC은 필드 이름을 나타냄
- Kibana: Dev Tools > Grok Debugger에서 테스트 가능
- 자세한 내용은 https://www.elastic.co/guide/en/elasticsearch/reference/current/grok.html 참고
6. 파이프라인 코드 구성 예시
- Logstash를 사용하여 Apache 웹 서버 로그를 수집하고 ElasticSearch에 저장하는 간단한 예시
6.1 Apache Web 로그 예시
부연 설명
- 로그를 분석한 결과 로그 메시지들을 Grok 패턴으로 변환하면 다음과 같음
- "%{IPORHOST:clientip} - - \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response} %{NUMBER:bytes} \"%{URI:referrer}\" \"%{DATA:useragent}\""
6.2 로그를 Elasticsearch에 적재하기 위해 logstash-apache.conf 파일 구성
부연 설명
- input 섹션
- path: logstash가 읽을 파일 경로를 지정
- start_position: "beginning"으로 설정 시 파일의 시작부터 로그를 읽음
- sincedb_path: `/dev/null`로 설정하여 Logstash가 재시작될 때마다 파일의 시작부터 다시 읽도록 처리
- sincedb 데이터베이스 파일을 파일을 어디까지 읽었는지 기록하는 파일
- sincdb_path를 별도로 입력하지 않을 경우 엘라스틱은 기본값으로 logstash data 폴더의 data/plugins/inputs/file 위치에 sincedb 데이터베이스 파일을 생성
- /dev/null로 지정할 경우 sincedb 파일을 만들지 않기 때문에 이전 파일을 읽었던 기록이 없어 매번 logstash를 실행할 때마다 파일을 처음부터 읽게 됨
- filter 섹션의 grok 필터
- %{IPORHOST:clientip}: 클라이언트 IP 주소 또는 호스트 이름
- %{HTTPDATE:timestamp}: 요청 시간
- %{WORD:verb}: HTTP 메서드 (예: GET, POST)
- %{URIPATHPARAM:request}: 요청된 URI와 파라미터
- %{NUMBER:httpversion}: HTTP 버전
- %{NUMBER:response}: HTTP 응답 코드
- %{NUMBER:bytes}: 응답 바이트 수
- %{URI:referrer}: 참조 URI
- filter 섹션의 date 필터
- match: "timestamp" 필드를 파싱 하여 "@timestamp" 필드에 설정
- 로그의 날짜 형식을 "dd/MMM/yyyy:HH:mmZ"로 지정
- filter 섹션의 useragent 필터
- source: "useragent" 필드에서 사용자 에이전트 정보를 파싱
- target: 결과를 "useragent_details" 필드에 저장
- filter 섹션의 geoip 필터
- source: "clientip" 필드에서 IP 주소를 사용
- target: IP 주소로부터 추출한 geoip 정보를 "geoip" 필드에 저장
- output 섹션
- hosts: Elasticsearch의 호스트를 지정하며 여기서는 http://localhost:9200로 설정
- index: 데이터를 저장할 인덱스 이름을 지정하며 여기서는 apache-weblog-test
6.3 logstash 실행 및 Elasticsearch 인덱스 확인
- /bin/logstash -f {logstash-apache.conf 경로} 명령어를 통해 logstash 실행
- 실행하면 로그를 통해 logstash가 정상적으로 작동하여 Elasticsearch에 데이터를 적재하는 것을 확인 가능
참고
- 패스트 캠퍼스 - 고성능 검색 엔진 구축으로 한 번에 끝내는 Elasticsearch
- 엘라스틱 개발부터 운영까지 (김준영, 정상운 저)
반응형
'Elastic Search' 카테고리의 다른 글
[Elasticsearch] ILM (0) | 2024.06.27 |
---|---|
[ELK] Beats 정리 (0) | 2024.06.25 |
[Elasticsearch] 검색 정확도와 랭킹 (0) | 2024.06.19 |
[Elasticsearch] Fuzzy 쿼리 (0) | 2024.06.19 |
[Elasticsearch] 스크립트 쿼리 (0) | 2024.06.13 |