๐Ÿ” ELK ์Šคํƒ: ๋ฐ์ดํ„ฐ ๋ถ„์„์˜ ์ƒˆ๋กœ์šด ์‹œ์ž‘, ์™„๋ฒฝ ๊ฐ€์ด๋“œ

์•ˆ๋…•ํ•˜์„ธ์š”! ๋น…๋ฐ์ดํ„ฐ ์‹œ๋Œ€์— ์‚ด๊ณ  ์žˆ๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋Š” ์ด์ œ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜์ฃ . ์ˆ˜๋งŽ์€ ๋กœ๊ทธ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๋ฐ”๋กœ ์—ฌ๊ธฐ, ELK ์Šคํƒ์ด ๊ทธ ํ•ด๋‹ต์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ELK ์Šคํƒ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ณ , ์ง์ ‘ ์„ค์น˜ํ•˜๊ณ  ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊นŒ์ง€ ํ•จ๊ป˜ ํŒŒํ—ค์ณ ๋ณผ๊ฒŒ์š”. ๐Ÿ’ก

ELK ์Šคํƒ์€ Elasticsearch, Logstash, Kibana ์„ธ ๊ฐ€์ง€ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์˜ ์•ฝ์ž๋กœ, ๋กœ๊ทธ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”์— ์ตœ์ ํ™”๋œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ ์ ‘ํ•˜์‹œ๋Š” ๋ถ„๋“ค๋„ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ๋„๋ก, ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์„ค๋ช…ํ•ด ๋“œ๋ฆด๊ฒŒ์š”. ๋ณต์žกํ•˜๊ฒŒ๋งŒ ๋А๊ปด์กŒ๋˜ ๋กœ๊ทธ ๋ถ„์„์ด ์ด ๊ธ€์„ ํ†ตํ•ด ํ›จ์”ฌ ์นœ์ˆ™ํ•˜๊ฒŒ ๋‹ค๊ฐ€์˜ฌ ๊ฑฐ์˜ˆ์š”.


 

ELK ์Šคํƒ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

 

ELK ์Šคํƒ์€ ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์œ„ํ•œ ํ†ตํ•ฉ ์†”๋ฃจ์…˜์œผ๋กœ, E(Elasticsearch), L(Logstash), K(Kibana)์˜ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • Elasticsearch (์—˜๋ผ์Šคํ‹ฑ์„œ์น˜): ๋ถ„์‚ฐํ˜• ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ์—”์ง„์ž…๋‹ˆ๋‹ค. ๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ƒ‰์ธํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ํŠนํ™”๋˜์–ด ์žˆ์–ด์š”. ๋งˆ์น˜ ๊ฑฐ๋Œ€ํ•œ ๋„์„œ๊ด€์˜ ์ฑ…์„ ์ˆœ์‹๊ฐ„์— ์ฐพ์•„์ฃผ๋Š” ๋˜‘๋˜‘ํ•œ ์‚ฌ์„œ์™€ ๊ฐ™์ฃ . JSON ๊ธฐ๋ฐ˜์˜ REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Logstash (๋กœ๊ทธ์Šคํƒœ์‹œ): ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ๋ณ€ํ™˜ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์†Œ์Šค(๋กœ๊ทธ ํŒŒ์ผ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์›น ์„œ๋ฒ„ ๋“ฑ)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ Elasticsearch๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์‰ฌ์šด ํ˜•ํƒœ๋กœ ๊ฐ€๊ณตํ•˜๊ณ  ์ „์†กํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ‘์ฒญ์†Œ๋ถ€’๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ํŽธํ•ด์š”.
  • Kibana (ํ‚ค๋ฐ”๋‚˜): ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ๋ฐ ํƒ์ƒ‰ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Elasticsearch์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์–‘ํ•œ ์ฐจํŠธ, ๊ทธ๋ž˜ํ”„, ๋Œ€์‹œ๋ณด๋“œ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•œ๋ˆˆ์— ๋“ค์–ด์˜ค๋Š” ๋ฉ‹์ง„ ์‹œ๊ฐํ™”๋กœ, ๋ฐ์ดํ„ฐ์—์„œ ์˜๋ฏธ ์žˆ๋Š” ์ธ์‚ฌ์ดํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค˜์š”.

์ด ์„ธ ๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์œ ๊ธฐ์ ์œผ๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ, ๋กœ๊ทธ ๋ถ„์„์˜ ๋ชจ๋“  ๊ณผ์ •์„ ์ž๋™ํ™”ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์›น ์„œ๋ฒ„์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ˆ˜๋งŽ์€ ๋กœ๊ทธ๋ฅผ Logstash๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ˆ˜์ง‘ํ•˜๊ณ , Elasticsearch๊ฐ€ ์ด๋ฅผ ๋น ๋ฅด๊ฒŒ ์ƒ‰์ธํ•˜์—ฌ ์ €์žฅํ•˜๋ฉด, Kibana๋ฅผ ํ†ตํ•ด ์›น์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ์ž ์ˆ˜, ์—๋Ÿฌ ๋กœ๊ทธ ๋ฐœ์ƒ ๋นˆ๋„ ๋“ฑ์„ ๋ฉ‹์ง„ ๋Œ€์‹œ๋ณด๋“œ๋กœ ํ•œ๋ˆˆ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์ฃ .


 

ELK ์Šคํƒ ์„ค์น˜ ์ค€๋น„: ํ™˜๊ฒฝ ์„ค์ •๋ถ€ํ„ฐ ์‹œ์ž‘!

 

ELK ์Šคํƒ์„ ์„ค์น˜ํ•˜๊ธฐ ์ „์— ๋ช‡ ๊ฐ€์ง€ ์ค€๋น„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค์ธ Docker๋ฅผ ์ด์šฉํ•œ ์„ค์น˜ ๋ฐฉ๋ฒ•์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๋ช…ํ•ด ๋“œ๋ฆด๊ฒŒ์š”. Docker๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝ์ ์ธ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด ํ™˜๊ฒฝ ์„ค์ •์ด ํ›จ์”ฌ ๊ฐ„ํŽธํ•˜๊ณ , ์šด์˜์ฒด์ œ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

1. Docker ๋ฐ Docker Compose ์„ค์น˜

 

๋จผ์ €, ์—ฌ๋Ÿฌ๋ถ„์˜ ์‹œ์Šคํ…œ์— Docker์™€ Docker Compose๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ณต์‹ ์›น์‚ฌ์ดํŠธ์—์„œ ๊ฐ ์šด์˜์ฒด์ œ์— ๋งž๋Š” ์„ค์น˜ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์„ค์น˜ํ•ด ์ฃผ์„ธ์š”.

  • Docker: https://www.docker.com
  • Docker Compose: Docker Desktop์— ํฌํ•จ๋˜์–ด ์žˆ๊ฑฐ๋‚˜, ๋ณ„๋„๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ํ„ฐ๋ฏธ๋„์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์ •์ƒ ์„ค์น˜ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”.

Bash

docker --version
docker-compose --version

 

2. docker-compose.yml ํŒŒ์ผ ์ƒ์„ฑ

 

์ด์ œ ELK ์Šคํƒ์˜ ์„ธ ๊ฐ€์ง€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก docker-compose.yml ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•ด์„œ docker-compose.yml์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ•ด ์ฃผ์„ธ์š”. ์ด ํŒŒ์ผ์€ ELK ์Šคํƒ์˜ ๋กœ๊ทธ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๋Š” ํ•ต์‹ฌ ์„ค์ • ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

YAML

version: '8.4'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.4.1
    container_name: elasticsearch
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    volumes:
      - elasticsearch-data:/usr/share/elasticsearch/data

  logstash:
    image: docker.elastic.co/logstash/logstash:8.4.1
    container_name: logstash
    ports:
      - "5044:5044"
    volumes:
      - ./logstash-config:/usr/share/logstash/config
      - ./logstash-pipeline:/usr/share/logstash/pipeline
    depends_on:
      - elasticsearch

  kibana:
    image: docker.elastic.co/kibana/kibana:8.4.1
    container_name: kibana
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    environment:
      ELASTICSEARCH_HOSTS: '["http://elasticsearch:9200"]'

volumes:
  elasticsearch-data:

์ฐธ๊ณ : xpack.security.enabled=false๋Š” ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค. ์‹ค์Šต์šฉ์œผ๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด๋ฉฐ, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ณด์•ˆ ์„ค์ •์„ ๋ฐ˜๋“œ์‹œ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

3. Logstash ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ

 

Logstash๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  Elasticsearch๋กœ ๋ณด๋‚ด๊ธฐ ์œ„ํ•œ ํŒŒ์ดํ”„๋ผ์ธ ์„ค์ •์„ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. docker-compose.yml ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์— logstash-pipeline์ด๋ผ๋Š” ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ์•ˆ์— logstash.conf ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด ์•„๋ž˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์Šค๋‹ˆํŽซ

input {
  # ์˜ˆ์‹œ: beats์—์„œ ์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ 5044 ํฌํŠธ๋กœ ๋ฐ›์Œ
  beats {
    port => 5044
  }
}

filter {
  # ์˜ˆ์‹œ: ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต์„ ์œ„ํ•œ ํ•„ํ„ฐ (ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€)
  # grok, mutate, date ๋“ฑ ๋‹ค์–‘ํ•œ ํ•„ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
}

output {
  # Elasticsearch๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "my-app-logs-%{+YYYY.MM.dd}" # ์ธ๋ฑ์Šค ์ด๋ฆ„ ์„ค์ •
  }
}

์œ„ ์„ค์ •์€ Beats(๋กœ๊ทธ ์ˆ˜์ง‘ ์—์ด์ „ํŠธ)๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ Elasticsearch๋กœ ์ „์†กํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค ์ด๋ฆ„์€ ๋‚ ์งœ๋ณ„๋กœ ์ƒ์„ฑ๋˜๋„๋ก % {+YYYY.MM.dd}์™€ ๊ฐ™์€ ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


 

ELK ์Šคํƒ ์‹คํ–‰ ๋ฐ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘

๐Ÿ” ELK ์Šคํƒ: ๋ฐ์ดํ„ฐ ๋ถ„์„์˜ ์ƒˆ๋กœ์šด ์‹œ์ž‘, ์™„๋ฒฝ ๊ฐ€์ด๋“œ

์ด์ œ ๋ชจ๋“  ์ค€๋น„๊ฐ€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ํ„ฐ๋ฏธ๋„์—์„œ docker-compose.yml ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™ํ•˜์—ฌ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ELK ์Šคํƒ์ด ํ•œ ๋ฒˆ์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Bash

docker-compose up -d

-d ์˜ต์…˜์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค. ์ž ์‹œ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์„ธ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ชจ๋‘ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. docker-compose ps ๋ช…๋ น์–ด๋กœ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ด์ œ ๋กœ๊ทธ ๋ถ„์„์„ ์œ„ํ•œ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด๋ด…์‹œ๋‹ค. Logstash๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด Filebeat๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ๊ฒŒ์š”. Filebeat๋Š” ์ง€์ •๋œ ํŒŒ์ผ์˜ ๋กœ๊ทธ๋ฅผ ์ฝ์–ด Logstash๋‚˜ Elasticsearch๋กœ ์ „์†กํ•˜๋Š” ๊ฒฝ๋Ÿ‰์˜ ์—์ด์ „ํŠธ์ž…๋‹ˆ๋‹ค.

 

1. Filebeat ์„ค์น˜ ๋ฐ ์„ค์ •

 

Filebeat ๊ณต์‹ ์›น์‚ฌ์ดํŠธ์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ OS์— ๋งž๋Š” ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์••์ถ•์„ ํ’€์–ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  filebeat.yml ํŒŒ์ผ์„ ์—ด์–ด Logstash๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋„๋ก ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

YAML

# ... (์ค‘๋žต) ...

# Logstash ์ถœ๋ ฅ ์„ค์ •
output.logstash:
  hosts: ["localhost:5044"] # Logstash ์ปจํ…Œ์ด๋„ˆ์˜ ํฌํŠธ๋กœ ์„ค์ •

# ์ž…๋ ฅ ์„ค์ • (์˜ˆ: ๋กœ์ปฌ ๋กœ๊ทธ ํŒŒ์ผ)
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/my-app.log # ๋กœ๊ทธ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์„ธ์š”.

hosts๋Š” ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ localhost๋กœ ์„ค์ •ํ•˜๊ณ , ํฌํŠธ๋Š” docker-compose.yml์—์„œ Logstash์— ์„ค์ •ํ•œ ํฌํŠธ์ธ 5044๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. paths๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ์ˆ˜์ง‘ํ•˜๊ณ  ์‹ถ์€ ๋กœ๊ทธ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝํ•ด ์ฃผ์„ธ์š”.

 

2. Filebeat ์‹คํ–‰

 

์ด์ œ Filebeat๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Bash

./filebeat -e

-e ์˜ต์…˜์€ ๋กœ๊ทธ๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•˜์—ฌ ๋””๋ฒ„๊น…์„ ๋•์Šต๋‹ˆ๋‹ค. ์ด์ œ my-app.log ํŒŒ์ผ์— ์ƒˆ๋กœ์šด ๋กœ๊ทธ๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค, Filebeat๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ Logstash๋กœ ๋ณด๋‚ด๊ณ , Logstash๋Š” Elasticsearch๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ณผ์ •์ด ์ž๋™ํ™”๋˜๋Š” ๊ฑฐ์ฃ !


 

Kibana์—์„œ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”ํ•˜๊ธฐ

 

์ด์ œ ๋“œ๋””์–ด Kibana๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•˜๊ณ  ELK ์Šคํƒ์˜ ์ง„์ •ํ•œ ๊ฐ€์น˜๋ฅผ ๋А๊ปด๋ณผ ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค.

 

1. Kibana ์ ‘์†

 

์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด๊ณ  http://localhost:5601๋กœ ์ ‘์†ํ•˜์„ธ์š”. ์ž ์‹œ ํ›„ Kibana ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

 

2. ์ธ๋ฑ์Šค ํŒจํ„ด ์ƒ์„ฑ

 

Kibana๊ฐ€ Elasticsearch์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์‹ํ•˜๋ ค๋ฉด ‘์ธ๋ฑ์Šค ํŒจํ„ด’์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์™ผ์ชฝ ๋ฉ”๋‰ด์—์„œ ‘Stack Management’ > ‘Index Management’๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. Logstash ์„ค์ • ํŒŒ์ผ์—์„œ ์ง€์ •ํ–ˆ๋˜ ์ธ๋ฑ์Šค ์ด๋ฆ„ ํŒจํ„ด(my-app-logs-*)์„ ์ž…๋ ฅํ•˜๊ณ , ์‹œ๊ฐ„ ํ•„๋“œ๋ฅผ time ๋“ฑ์œผ๋กœ ์ง€์ •ํ•ด์ค๋‹ˆ๋‹ค.

 

3. ๋ฐ์ดํ„ฐ ํƒ์ƒ‰ ๋ฐ ์‹œ๊ฐํ™”

 

์ด์ œ ‘Discover’ ๋ฉ”๋‰ด๋กœ ์ด๋™ํ•˜๋ฉด Elasticsearch์— ์ €์žฅ๋œ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

‘Visualize’ ๋ฉ”๋‰ด์—์„œ๋Š” ๋‹ค์–‘ํ•œ ์‹œ๊ฐํ™” ๋„๊ตฌ๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐจํŠธ, ๊ทธ๋ž˜ํ”„ ๋“ฑ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์›น ์„œ๋ฒ„ ๋กœ๊ทธ์—์„œ ‘Error’ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์ƒํ•œ ํšŸ์ˆ˜๋ฅผ ์‹œ๊ฐ„๋Œ€๋ณ„๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ์ด์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”๋ฅผ ํ†ตํ•ด ์ˆจ๊ฒจ์ง„ ํŒจํ„ด์ด๋‚˜ ์ด์ƒ ์ง•ํ›„๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


 

ELK ์Šคํƒ ํ™œ์šฉ ๊ฟ€ํŒ ๋ฐ FAQ

 

 

Q1. ELK ์Šคํƒ, ์™œ ์ด๋ ‡๊ฒŒ ์ธ๊ธฐ๊ฐ€ ๋งŽ์€๊ฐ€์š”?

 

A1. ELK ์Šคํƒ์€ ์˜คํ”ˆ์†Œ์Šค๋ผ์„œ ๋น„์šฉ ๋ถ€๋‹ด์ด ์ ๊ณ , ๋ฐฉ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์žˆ์–ด ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ชจ๋“ˆํ™”๋œ ๊ตฌ์„ฑ์œผ๋กœ ์œ ์—ฐํ•˜๊ฒŒ ์‹œ์Šคํ…œ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ๋ถ„์„์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์–ด ๊ธฐ์—…์˜ IT ์šด์˜ ํšจ์œจ์„ฑ์„ ํฌ๊ฒŒ ๋†’์—ฌ์ค๋‹ˆ๋‹ค.

 

Q2. ELK ์Šคํƒ ๋Œ€์‹  ๋‹ค๋ฅธ ๋„๊ตฌ๋Š” ์—†๋‚˜์š”?

 

A2. ELK ์Šคํƒ์˜ ๊ฒฝ์Ÿ์ž๋กœ๋Š” Splunk, Graylog ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Splunk๋Š” ์ƒ์šฉ ์†”๋ฃจ์…˜์œผ๋กœ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๊ณผ ํŽธ๋ฆฌํ•œ UI๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋น„์šฉ์ด ๋น„์Œ‰๋‹ˆ๋‹ค. Graylog๋Š” ELK์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ELK ์Šคํƒ์€ ์ด๋“ค ์ค‘ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋ฉฐ, ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ ๋ฉด์—์„œ ๋›ฐ์–ด๋‚œ ํ‰๊ฐ€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

Q3. ELK ์Šคํƒ์„ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‚˜์š”?

 

A3.

  1. Beats ํ™œ์šฉ: Filebeat ์™ธ์—๋„ Metricbeat(์‹œ์Šคํ…œ ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘), Auditbeat(๋ณด์•ˆ ๊ฐ์‚ฌ ๋กœ๊ทธ ์ˆ˜์ง‘) ๋“ฑ ๋‹ค์–‘ํ•œ Beats๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋” ๋งŽ์€ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์†์‰ฝ๊ฒŒ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. Ingest Node ์‚ฌ์šฉ: Logstash ๋Œ€์‹  Elasticsearch์˜ Ingest Node๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋ฉด Logstash์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. Index Lifecycle Management (ILM): ์˜ค๋ž˜๋œ ์ธ๋ฑ์Šค๋ฅผ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ๋ณด๊ด€ํ•˜๋Š” ์ •์ฑ…์„ ์„ค์ •ํ•˜์—ฌ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ฒฐ๋ก : ELK ์Šคํƒ์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ํž˜์„ ๊นจ์šฐ์„ธ์š”!

 

์ง€๊ธˆ๊นŒ์ง€ ELK ์Šคํƒ์˜ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…๋ถ€ํ„ฐ ์„ค์น˜, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ํ™œ์šฉ ๋ฐฉ๋ฒ•๊นŒ์ง€ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋ณต์žกํ•˜๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•œ ๋‹จ๊ณ„์”ฉ ๋”ฐ๋ผ ํ•ด๋ณด์‹œ๋ฉด ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋А๋ผ์‹ค ๊ฑฐ์˜ˆ์š”.

ELK ์Šคํƒ์€ ๋‹จ์ˆœํ•œ ๋กœ๊ทธ ๋ถ„์„ ๋„๊ตฌ๋ฅผ ๋„˜์–ด, ๋น„์ฆˆ๋‹ˆ์Šค ์ธ์‚ฌ์ดํŠธ๋ฅผ ๋„์ถœํ•˜๊ณ , ์‹œ์Šคํ…œ์˜ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ˆœํžˆ ์Œ“์•„๋‘๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์˜๋ฏธ ์žˆ๋Š” ์ •๋ณด๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ELK ์Šคํƒ๊ณผ ํ•จ๊ป˜ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์˜์‚ฌ๊ฒฐ์ •์˜ ์ƒˆ๋กœ์šด ์žฅ์„ ์—ด์–ด๋ณด์„ธ์š”.

์˜ค๋Š˜ ์„ค๋ช…๋“œ๋ฆฐ ๋‚ด์šฉ์ด ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ฐ์ดํ„ฐ ์—ฌ์ •์— ํฐ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”. ๋‹ค์Œ์—๋„ ๋” ์œ ์ตํ•œ ์ •๋ณด๋กœ ์ฐพ์•„๋ต™๊ฒ ์Šต๋‹ˆ๋‹ค! ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ˜Š