본문 바로가기
Backend/Etc

[ELK] ELK란?: Logstash와 Kibana 중심으로

by boolynn 2026. 7. 20.

1. ELK란?

ELK는 Elasticsearch, Logstash, Kibana 세 오픈소스 프로젝트를 묶어 부르는 이름이다.

  • Elasticsearch: 검색·저장·분석을 담당하는 핵심 엔진 (분산 검색엔진, 문서 기반 NoSQL)
  • Logstash: 다양한 소스에서 데이터를 수집하고, 가공(파싱/변환)한 뒤 Elasticsearch 등으로 보내는 파이프라인 도구
  • Kibana: Elasticsearch에 쌓인 데이터를 검색·시각화·대시보드로 보여주는 프론트엔드

전체 아키텍처를 그림으로 보면 대략 이렇다.

[애플리케이션/서버 로그]
      │
      ▼
  Filebeat (선택) ──► Logstash (수집·파싱·변환)
                            │
                            ▼
                      Elasticsearch (저장·색인)
                            │
                            ▼
                        Kibana (시각화)
cf. 이름이 왜 LEK가 아니라 ELK일까?
데이터가 흐르는 순서로 보면 Logstash → Elasticsearch → Kibana인데, 이름은 Elasticsearch가 맨 앞에 온다. 이건 파이프라인 순서가 아니라 "Elasticsearch를 중심에 둔 프로젝트군"이라는 관점의 이름이기 때문이다. Elasticsearch가 2010년에 먼저 나왔고, Logstash와 Kibana는 이후 Elasticsearch 생태계를 보완하려고 합류한 도구다.

2. Logstash: 로그를 정제하는 파이프라인

Logstash의 핵심은 input → filter → output 3단계 파이프라인이다.

2-1. 기본 구조

# logstash.conf
input {
  file {
    path => "/var/log/app/*.log"
    start_position => "beginning"
    sincedb_path => "/dev/null"  # 테스트 시 매번 처음부터 읽기
  }
}

filter {
  grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{LOGLEVEL:level}\] %{GREEDYDATA:msg}" }
  }
  date {
    match => ["timestamp", "ISO8601"]
    target => "@timestamp"
  }
  mutate {
    remove_field => ["timestamp", "host", "path"]
  }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "app-logs-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug }  # 디버깅용
}

2-2. input: 어디서 데이터를 받아올까

플러그인 용도

file 로그 파일 tail 읽기
beats Filebeat 등에서 전달받기 (5044 포트)
tcp / udp 소켓으로 직접 전송받기
jdbc RDB에서 주기적으로 쿼리해서 가져오기
kafka 메시지 큐에서 컨슘

실무에서는 로그 파일을 Logstash가 직접 읽기보다, 각 서버에 Filebeat(경량 에이전트)를 띄워 Logstash로 전달하는 구조를 많이 쓴다. Logstash는 JVM 기반이라 무겁고, Filebeat는 훨씬 가볍기 때문이다.

2-3. filter: 핵심 — 비정형 로그를 구조화하기

  • grok: 정규식 패턴 매칭으로 텍스트 로그를 필드로 분해. 미리 정의된 패턴(%{IP}, %{LOGLEVEL}, %{TIMESTAMP_ISO8601} 등)을 조합해서 쓴다.
  • json: 로그가 이미 JSON이면 파싱만 하면 되므로 grok보다 훨씬 가볍고 안전하다. (가능하면 애플리케이션에서 JSON 로그를 찍는 게 운영상 유리하다)
  • date: 로그 안의 시간 문자열을 Elasticsearch의 @timestamp로 매핑. 이걸 안 하면 Logstash가 수집한 시각이 타임스탬프가 되어버려서 실제 이벤트 시각과 어긋난다.
  • mutate: 필드 추가/삭제/타입 변환/이름 변경 등 잡다한 후처리.
  • grok vs json: 로그 포맷을 직접 통제할 수 있다면 JSON 구조화 로깅 + json filter 조합이 압도적으로 유지보수하기 쉽다. grok은 레거시 텍스트 로그를 다룰 때 쓰는 최후의 수단에 가깝다.

2-4. output: 어디로 보낼까

대부분 Elasticsearch로 보내지만, 동시에 S3 백업, Kafka로 재발행, 파일 저장 등도 가능하다. stdout { codec => rubydebug }은 개발 중 파이프라인이 제대로 파싱되는지 확인할 때 필수이다.

2-5. 운영 tip 

  • Persistent Queue: 기본적으로 Logstash 큐는 메모리에 있어서 프로세스가 죽으면 유실될 수 있다. queue.type: persisted로 디스크 큐를 켜면 안정성이 올라간다.
  • pipeline.workers / batch.size: 처리량이 부족하면 워커 수와 배치 크기를 조정한다. 다만 무작정 늘리면 Elasticsearch 인덱싱 부하로 옮겨갈 뿐이니 두 시스템을 같이 튜닝해야 한다.
  • Dead Letter Queue: 파싱 실패한 이벤트를 버리지 않고 별도 큐에 쌓아 나중에 재처리할 수 있다.

3. Kibana: 쌓인 로그를 보이게 만들기

3-1. Data View 만들기

Kibana에서 데이터를 조회하려면 먼저 어떤 인덱스를 볼지 지정하는 Data View를 등록해야 한다. 예를 들어 Logstash에서 app-logs-2026.07.20 같은 인덱스를 매일 생성한다면, app-logs-* 패턴으로 Data View를 만들면 모든 날짜의 인덱스를 하나로 묶어 조회할 수 있다.

3-2. Discover: 로그를 직접 뒤지는 화면

  • KQL(Kibana Query Language)로 필터링: level: "ERROR" and msg: *timeout*
  • 시간 범위 선택(우측 상단)과 조합해서 "최근 15분간 발생한 ERROR 로그"처럼 좁혀볼 수 있다.
  • 특정 필드를 클릭하면 바로 "이 값으로 필터", "이 값 제외" 같은 액션이 가능해서, 장애 원인 로그를 좁혀나갈 때 매우 빠르다.

3-3. 시각화: Lens / Visualize

  • Lens: 최근 Kibana의 기본 시각화 도구. 필드를 드래그 앤 드롭만 해도 막대/선/파이 차트가 만들어진다.
  • 자주 쓰는 패턴:
    • 시간대별 에러 발생 추이 (Date Histogram + Count)
    • 응답 코드별 비율 (Terms Aggregation on status_code)
    • API endpoint별 평균 응답시간 (Average Aggregation)

3-4. Dashboard

여러 시각화를 한 화면에 모아 실시간 모니터링 보드를 만든다. 장애 대응 시 지금 에러가 어디서 얼마나 나는지를 한눈에 보는 용도로 쓰인다.

3-5. Alerting (참고)

Kibana의 Stack Alerting 기능을 쓰면 "5분간 ERROR 로그가 100건 이상"같은 조건으로 Slack/이메일 알림을 걸 수 있다. ELK를 단순 로그 뷰어가 아니라 모니터링 시스템으로 확장하는 지점이다.


4. Logstash가 꼭 필요할까? (Filebeat만으로는 안 될까)

  • 가벼운 수집만 필요하면: Filebeat → Elasticsearch 직결도 가능하다 (Filebeat의 ingest pipeline 기능으로 간단한 파싱도 가능).
  • 복잡한 파싱/변환/여러 소스 통합이 필요하면: Logstash가 필요하다. grok 파싱, 여러 input 병합, 조건부 라우팅(if [type] == "nginx" { ... }) 같은 건 Logstash의 영역이다.
  • 실무에서는 Filebeat(수집) + Logstash(정제) + Elasticsearch(저장) + Kibana(시각화) 조합이 가장 흔하다.

5.  마무리

Logstash는 지저분한 로그를 구조화된 데이터로 바꾸는 변환기, Kibana는 그 데이터를 사람이 읽을 수 있게 보여주는 창구라고 요약할 수 있다. 둘 다 Elasticsearch라는 저장소를 중심에 두고 붙어 있는 도구로, Elasticsearch와 함께 서버마다 흩어져있는 로그들을 검색 가능하고(Elasticsearch) 자동으로 정리되고(Logstash) 시각적으로 확인 가능한(Kibana) 형태로 바꿔준다. 이를 통해 로그를 잘 활용할 수 있게 된다.

'Backend > Etc' 카테고리의 다른 글

[성능테스트] K6를 활용한 부하테스트  (0) 2026.05.07