[Elastic] filebeat, logstash, elasticsearch, kibana 설치 및 로그 확인

2025. 7. 19. 23:17Backend/ELK

 

회사에서 업무적으로 다루고 있는 ELK stack에 좀 더 익숙해지고자, 로컬 환경에서 설치하여 로그를 확인하는 과정까지를 다룬 글입니다. Elastic 초보의 글이라 부족한 점이 있을 수 있으니, 잘못된 정보는 말씀해주시면 정말 감사합니다😊


📝 Elastic 이란?

 

Elastic 공식 홈페이지에서 ELK stack 에 대해 다음과 같이 소개하고 있습니다.

 

Elasticserach는 속도, 확장성 및 AI 애플리케이션을 위해 구축된 오픈 소스 분산형 검색 및 분석 엔진

https://www.elastic.co/kr/elasticsearch

 

오픈 소스 서버의 데이터 처리 파이프라인인 Logstash

다양한 소스에서 데이터를 수집하여 변환한 후 자주 사용하는 저장소로 전달

https://www.elastic.co/kr/logstash

 

Kibana를 사용하여 데이터 분석을 신속하고 규모에 맞게 실행하여 관찰, 보안 및 검색을 수행

https://www.elastic.co/kr/kibana

 

 

여기서 순서는 다음과 같습니다.

 

Beats -> Logstash -> Elasticsearch -> Kibana

 

Beats (예: filebeats)는 경량 데이터 수집기로서 로그 파일, 메트릭 지표 등을 수집하는 역할을 담당합니다. 이렇게 수집된 로그를 Logstash가 가공, 필터링, 변환하는데요. 이후 가공된 로그를 Elasticsearch에 전달해주면, 전달된 로그를 저장, 검색, 활용할 수 있게 됩니다. 그리고 이렇게 활용할 수 있도록 시각화해주는 역할이 Kibana인 것이죠!!

 

Spring 프로젝트에서 Prometheus가 여러 메트릭 지표들을 수집하고, Grafana 등을 통해 시각화하는 것처럼, ELK stack 각 구성들은 그 역할을 감당하여 운영/개발에 큰 도움을 주고 있습니다.


사실 Elasticsearch를 검색하면, Elastic 공식 홈페이지나 Elastic 가이드북을 참고할 수 있는데요!! 저는 gpt와 호흡하며 가볍게 구축하여, 흐름을 이해하고 테스트하고자 합니다.

 

👇👇👇 참고할 수 있는 사이트들입니다. (나중에 더 깊게 공부하기 위해 글에 주소 추가해둡니다😊)

 

Get started | Elastic Docs

Elasticsearch is a distributed search and analytics engine, scalable data store, and vector database built on Apache Lucene. It’s optimized for speed...

www.elastic.co

 

 

Elastic 가이드 북 | Elastic 가이드북

이 가이드북은 출판을 위해 집필중이던 내용을 Elastic을 처음 시작하시는 분들께 도움이 되고 커뮤니티와 함께 완성 해 나가려는 목적으로 공개하게 되었습니다. 모든 문서에 대한 저작권은 저

esbook.kimjmin.net


 

🦜 ELK (with docker-compose.yml)

 

Elastic을 설치하는 방법은 여러가지 있는데요! Local에 직접 설치 파일을 다운로드 받아 설치하는 방법, Docker 이용 등 있습니다. 저는 제 개인 노트북(local)에 Docker-compose 를 이용해서 다운로드 하려고 합니다.

 

일단 특정 디렉토리에 docker-compose.yml 파일을 생성하고 작성합니다.

 

./docker-compose.yml

//version: "3.7" //obsolete라고 나오길래 삭제했습니다.

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.13.4
    container_name: elasticsearch
    environment:
      - discovery.type=single-node  //단일 노드가 아닌 클러스터로 구축하셔도 됩니다
      - xpack.security.enabled=false  //보안 기능 비활성화
      - xpack.security.http.ssl.enabled=false  //HTTP SSL 비활성화
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms1g -Xmx1g  //JVM heap 사이즈
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - "9200:9200"  //host port (9200) -> container port (9200)
    volumes:
      - elkdata:/usr/share/elasticsearch/data

  kibana:
    image: docker.elastic.co/kibana/kibana:8.13.4
    container_name: kibana
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200  //elasticsearch 주소
      - ELASTICSEARCH_USERNAME=admin  //보안 설정 할 때 필요, elastic 사용 불가능
      - ELASTICSEARCH_PASSWORD=admin  //보안 설정 할 때 필요
      - xpack.security.enabled=false  //Kibana 보안 기능 비활성화
    ports:
      - "5601:5601"  //host port(5601) -> container port(5601)
    depends_on:
      - elasticsearch  //elasticsearch가 실행 이후에, kibana 실행

  logstash:
    image: docker.elastic.co/logstash/logstash:8.13.4
    container_name: logstash
    ports:
      - "5044:5044"  //Beats로부터 데이터 수신 port
      - "9600:9600"  //Logstash 모니터링용 port
    volumes:
      - ./logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    depends_on:
      - elasticsearch  //elasticsearch가 실행 이후에, kibana 실행
    environment:
      - xpack.monitoring.enabled=false

  filebeat:
    image: docker.elastic.co/beats/filebeat:8.13.4
    container_name: filebeat
    user: root
    volumes:
      - ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
      - ./logs/:/logs/
    depends_on:
      - logstash

volumes:
  elkdata:

 

그런데 문제점이 Windows 환경에서는 filebeat.yml 를 전혀 읽지를 못하는 상황이 발생했습니다.

Exiting: error loading config file: config file ("filebeat.yml") can only be writable by the owner but the p ermissions are "-rwxrwxrwx" (to fix the permissions use: 'chmod go-w /usr/share/filebeat/filebeat.yml')

 

그래서 Dockerfile을 하나 더 추가해주는 방식으로 해결했습니다. 

 

./filebeat/Dockerfile 추가

FROM docker.elastic.co/beats/filebeat:8.13.4
USER root
COPY filebeat.yml /usr/share/filebeat/filebeat.yml

 

./docker-compose.yml 수정

//상단 생략
filebeat:
    build:
      context: ./filebeat
    container_name: filebeat
    user: root
    volumes:
      - ./logs/:/logs/
    depends_on:
      - logstash
//하단 생략

 

 

그리고 위 설정 파일의 volume에서 볼 수 있는 것처럼, 해당 디렉토리 하위에 logs, filebeat, logstash 폴더를 생성하였습니다.

 

./logstash/logstash.conf

input {
  beats {
    port => 5044
  }
}

filter {
  grok {
    match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:msg}" }
  }
  date {
    match => ["timestamp", "yyyy-MM-dd HH:mm:ss"]
    target => "@timestamp"
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "test-elk-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug }
}

 

./filebeat/filebeat.yml

filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /logs/test-elk.log

output.logstash:
  hosts: ["logstash:5044"]

 

 

이후 docker-compose를 실행하였습니다. (돈을 모아 window에서 mac으로 넘어가리라)

 

그렇게 하니 the attribute 'version' is obsolete라고 나오는데요!! 그래서 설정 파일에서 version을 제거하였습니다.

 

docker-compose로 각 파일들 설치 완료!

 

처음에는 다음과 같은 화면이 나올텐데, 기다려주시면 됩니다~!

 

이후 다음과 같은 화면이 나옵니다. 버전 7까지는 Kibana가 나왔었는데, 버전 8부터는 elastic이라고 나오는 것 같습니다.

 


로그를 보기 위해 미리 설정을 해주려고 합니다.

 

Stack Management > Data Views > create data view > index patten, timestamp 입력

 

 

여기서 로그를 filebeat 등에 전달해주지 않으면 참조할 내용이 없기에, 이런 안내 문구가 나오게 됩니다.


전달하기 위하여 스프링 부트 프로젝트를 만들어 실행하였습니다. filebeat(로그 수집용)부터 kibana까지 어떻게 로그가 수집되고 전달되는지 확인해보려고 합니다. (테스트를 위해 web, lombok만 dependency에 추가하여 프로젝트를 생성하였습니다)

 

 

 

postman을 이용하여 호출을 몇 번 진행하여 로그를 생성하였습니다.

 

이후 다시 Data views를 확인해보면

 

이렇게 나오는 것을 확인할 수 있습니다!!

 

이후 Discover에서 설정해주면 아래와 같이 로그들을 확인할 수 있었습니다.

 


 

그럼 postman으로 request 했을 때, 로그는 어떻게 남아 있을까요???

 

1) postman 요청

 

2) filebeat 로그 확인

"message":"Loading Inputs: 1","service.name":"filebeat","ecs.version":"1.6.0"}
"message":"starting input, keys present on the config: 
"message":"Configured paths: [/logs/test-elk.log]"
"message":"Starting input (ID: ~~~~~)"
"message":"Loading and starting Inputs completed. Enabled inputs: 1"

 

3) logstash 로그 확인

 
{
    "ecs" => {
        "version" => "8.0.0"
    },
    "timestamp" => "2025-07-19 22:59:31",
    "event" => {
        "original" => "2025-07-19 22:59:31 INFO  c.t.e.controller.ELKController - ===== [TEST] controller end ====="
    },
    "@timestamp" => 2025-07-19T22: 59: 31.000Z,
    "message" => "2025-07-19 22:59:31 INFO  c.t.e.controller.ELKController - ===== [TEST] controller end =====",
    //생략
    "log" => {
        "offset" => 3702,
        "file" => {
            "path" => "/logs/test-elk.log"
        }
    },
    "level" => "INFO",
    "msg" => " c.t.e.controller.ELKController - ===== [TEST] controller end =====",
   //생략
}
 

 

4) Kibana 확인

 

 

개발/운영할 때, 로그 하나하나가 정말 중요합니다. 장애가 발생했을 때, 서버에 직접 접속하여 로그를 확인하지 않고서도, 대응을 빠르게 할 수 있습니다. 또한 여러 서버들을 운영하기에, 다양한 서버에서 발생하는 로그들을 안정적으로 수집하고 모니터링 할 수 있다는 장점이 있습니다.

 

References

1. Elastic stack : https://www.elastic.co/kr/

 

 

 

 

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

[Error/ELK/LogStash] pipeline has terminated  (0) 2025.11.19