Elastic Search

[ELK] Logstash 정리

꾸준함. 2024. 6. 25. 15:46

Logstash

  • Elastic Stack의 중요한 구성 요소 중 하나로 로그 및 이벤트 데이터를 수집, 변환, 저장하는 데이터 처리 파이프라인
  • 다양한 소스에서 데이터를 수집하여 Elasticsearch와 같은 저장소로 전송하기 전에 데이터를 필터링 및 변환하는 데 사용
    • 다양한 데이터소스를 쉽게 연동할 수 있는 기능 제공
    • Elasticsearch와의 연동이 잘 되어있기 때문에 로그 수집을 해서 분석, 모니터링 하는데까지 용이하게 사용 가능

 

https://www.bmc.com/blogs/logstash-using-data-pipeline/

 

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

 

filter

  • grok: 구조화되지 않은 로그 데이터를 분석하고 구조화
  • dissect: 간단한 패턴을 사용해 메시지를 구조화된 형태로 분석, 정규식을 사용하지 않아 grok에 비해 자유도는 조금 떨어지는 편
  • mutate: 변형
  • drop: 삭제
  • clone: 복사본 만들기
  • https://www.elastic.co/guide/en/logstash/current/filter-plugins.html

 

output

 

codec

  • json: JSON으로 인코딩/디코딩
  • multiline: 여러줄의 메시지를 하나의 이벤트로 합치기

 

5.2 grok 사용법

  • 5.1 주요 파이프라인에서 소개한 filter 중 하나로 로그 데이터와 같은 비구조화된 데이터를 구조화된 데이터로 변환하는데 유용한 파서
  • Grok 패턴은 정규 표현식을 사용하여 텍스트에서 원하는 정보를 추출하는 방법이며 logstash 필터에서 주로 사용
  • %{SYNTAX:SEMANTIC} 형식을 따름

 

Grok Debugger

 

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