๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’พ.knwldg

docker-ELK, Filebeat, ๊ทธ๋ฆฌ๊ณ  docker compose - #1

์˜ค๋Š˜๋„ ์ƒˆ๋กœ์šด ๊ฑธ ๊ฑด๋“œ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์นœ๊ตฌ๋“ค๊ณผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ

๋‚œ์ƒ ์ฒ˜์Œ ELK ์Šคํƒ๊ณผ docker๋ฅผ ์จ๋ณด๊ฒŒ ์ƒ๊ฒผ๋„ค์š”๐Ÿณ๐Ÿณ

 

์›Œ๋‚™ ์ด๊ฒƒ์ €๊ฒƒ ๋งŽ์ด ๊ธ์–ด๋ชจ์œผ๋ฉด์„œ ์ง„ํ–‰ํ•˜๋Š” ์ค‘์ด๋ผ ์Šค์Šค๋กœ ๊นŒ๋จน์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์ •๋ฆฌํ•˜๋Š” ์„ฑ๊ฒฉ์ด ๊ฐ•ํ•˜์ง€๋งŒ

๊ทธ๋ž˜๋„ ํ˜น์‹œ๋‚˜ ๋ˆ„๊ตฌ์—๊ฒŒ๋Š” ๋„์›€์ด ๋ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ๊นŒ... ํ•˜๋Š” ๋งˆ์Œ์œผ๋กœ ์ตœ๋Œ€ํ•œ ์ด์˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋กœ ์ฐพ์•„๋ณด๋ฉด์„œ ์‹คํ–‰ํ•ด๋ณด๋ฉด์„œ ์“ฐ๋Š”๊ฑฐ๋ผ ์ •ํ™•ํ•˜์ง€ ์•Š์€ ๋‚ด์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค๐Ÿ˜ฅ

 

1. ํ•„์š”ํ•œ ๋‚ด์šฉ

์ผ๋‹จ ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒด ํด๋” ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

morgen-muffel
โ”œโ”€test-server
โ”‚  โ”œโ”€app.py
โ”‚  โ””โ”€Dockerfile
โ”œโ”€log-server
โ”‚  โ”œโ”€elasticsearch
โ”‚  โ”œโ”€kibana
โ”‚  โ”œโ”€logstash
โ”‚  โ””โ”€docker-compose.yml
โ””docker-compose-test.yml

ํด๋”๋ž‘ ํŒŒ์ผ ์ƒ‰์„ ๊ตฌ๋ถ„ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๊ทธ๊ฑด ํฌ๊ธฐํ•˜๋„๋ก ํ•˜๊ตฌ์š”๐Ÿ™„

test-server์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋กœ๊ทธ๋ฅผ Filebeat๊ฐ€ ๋ฐ›์•„์„œ Logstash๋กœ ๋ณด๋‚ด๊ณ , ์ด๋ฅผ Elasticsearch์— ์ ์žฌํ•˜๊ณ  Kibana๋กœ ๋ณด๋Š”

์ง€๊ทนํžˆ ์ƒ์‹์ ์ด๊ณ  ์ผ๋ฐ˜์ ์ธ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

๋‹ค๋งŒ ELK๋‚˜ docker๋ฅผ ์ฒ˜์Œ ์“ฐ๋‹ค๋ณด๋‹ˆ ์•Œ์•„์•ผ ํ• ๊ฒŒ ๋„ˆ๋ฌด ๋งŽ์•„์„œ ์•ฝ๊ฐ„ ๊ณ ํ†ต์Šค๋Ÿฝ๋„ค์š”!

์ง€๊ธˆ docker-compose๊ฐ€ ๋‘ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋Š”๋ฐ

log-server ์•„๋ž˜ ์žˆ๋Š” docker-compose.yml ํŒŒ์ผ์€ ELK stask์„ ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ์— ๋„์›Œ์ฃผ๋Š” ์•„์ฃผ ์ฐฉํ•œ ๋…€์„์ด๊ตฌ์š”(๋‹น์—ฐํžˆ ์ œ๊ฐ€ ๋งŒ๋“ค์ง„ ์•Š์•˜์Šต๋‹ˆ๋‹ค)

 

GitHub - deviantony/docker-elk: The Elastic stack (ELK) powered by Docker and Compose.

The Elastic stack (ELK) powered by Docker and Compose. - GitHub - deviantony/docker-elk: The Elastic stack (ELK) powered by Docker and Compose.

github.com

์ œ๊ฐ€ ๋งŒ๋“ค์–ด์•ผ ํ•  ๊ฒƒ์€ morgen-muffel ํ•˜์œ„์— ์žˆ๋Š” docker-compose-test.yml ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

์ด ์นœ๊ตฌ์˜ ์—ญํ• ์€

test-server์— ์žˆ๋Š” Dockerfile์„ ์‹คํ–‰ํ•ด app.py์— ์žˆ๋Š” ๋‚ด์šฉ์œผ๋กœ flask๋กœ ๋„์šฐ๋Š” ๊ฒƒ๊ณผ ๋™์‹œ์—

flask๋กœ ๋งŒ๋“ค์–ด์ง„ ์„œ๋ฒ„๊ฐ€ log ํด๋”์— ๋–จ๊ถˆ์ฃผ๋Š” ๋‚ด์šฉ์„ ์ฝ์–ด์„œ Logstash์— ์ €์žฅํ•˜๋Š” Filebeat๋ฅผ ๋„์šฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค๐Ÿคจ

๊ทธ๋ ‡๋‹ค๋ฉด docker-compose-test๋„ test-server ํด๋” ์•ˆ์— ๋งŒ๋“ค๋ฉด ๋ ํ…๋ฐ! ํ•˜๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ

์นœ๊ตฌ๋“ค๊ณผ ๋‚˜๋ˆ ์„œ ๋งŒ๋“ค๋‹ค๋ณด๋‹ˆ, ์ € test-server์— ํ•ด๋‹นํ•˜๋Š” ๋‚ด์šฉ์€ ๋‹ค๋ฅธ ์นœ๊ตฌ๊ฐ€ ๋งŒ๋“ค ์˜ˆ์ •์ด์—์š”

๋‚˜์ค‘์— ์–˜๊ธฐํ•ด๋ณด๊ณ  ํด๋” ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊ฟ€์ˆ˜๋„ ์žˆ์ง€๋งŒ

์ผ๋‹จ์€ "ํŠน์ • ๊ฒฝ๋กœ์— ์žˆ๋Š” Dockerfile๊ณผ Filebeat๋ฅผ ํ•จ๊ป˜ ๋„์šฐ๊ธฐ"์— ์ง‘์ค‘ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค

 

์ € ์œ„์— ์žˆ๋Š” ์Šคํƒ๋“ค ์ค‘์— ์ „ ์จ๋ณธ๊ฒŒ ํ•˜๋‚˜๋„ ์—†๋„ค์š”๐Ÿ˜๐Ÿ˜๐Ÿ˜๐Ÿ˜

์จ๋ณธ๊ฒŒ ์—†๋‹ค๋Š” ์–˜๊ธฐ๋Š” ์ € ๋‚ด์šฉ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋งŒ๋“œ๋Š” ๋ชจ๋“  ๊ณผ์ •์— ๊ตฌ๊ธ€์ด ํ•จ๊ป˜ํ•œ๋‹ค๋Š” ๊ฒƒ!๐Ÿš€

 

2. ํ…Œ์ŠคํŠธ์šฉ ์„œ๋ฒ„ ๋„์šฐ๊ธฐ

ํ…Œ์ŠคํŠธ์šฉ ์„œ๋ฒ„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€๊ฑธ ๋ฐ”๋ผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„์ฃผ ๋‹จ์ˆœํžˆ ์ ‘์†ํ•˜๋ฉด ์ ‘์†ํ•œ ์‹œ๊ฐ„๋งŒ log์— ๋–จ๊ถˆ์ฃผ๋Š” ์—ญํ• ๋งŒ ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์ด ํŒŒ์ผ์„ ์ฝ์–ด์„œ ES์— ์ œ๋Œ€๋กœ ๋ณด๋‚ด๋Š”์ง€๋งŒ ๋ณด๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์—!

ํ•˜์ง€๋งŒ ๊ทธ ์„œ๋ฒ„๋ฅผ Docker๋กœ ๋„์›Œ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

๊ทธ ๊ฐ„๋‹จํ•œ ๊ฒƒ๋„ ๊ตฌ๊ธ€์˜ ๋„์›€์„ ์ž”๋œฉ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์นจ docker compose ๋ฌธ์„œ์—์„œ flask๋กœ ์˜ˆ์‹œ๋ฅผ ๋“ค๊ณ  ์žˆ์–ด์„œ ์ด๊ฑธ ๋”ฐ๋ผํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

Get started with Docker Compose

 

docs.docker.com

app.py์˜ ๋‚ด์šฉ์„ flask๋กœ ๋„์šฐ๋Š” ์˜ˆ์‹œ์ธ๋ฐ ๊ฐ„๋‹จํ•˜๊ณ  ์•„์ฃผ ์ข‹๊ตฐ์š”.

ํ•˜์ง€๋งŒ ๋ฐ”๋กœ ๋ฌธ์ œ์— ๋ด‰์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ € ์˜ˆ์‹œ๋Š” redis์— count๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ, ์ „ log ํด๋”์— log๋ฅผ ๋–จ๊ตฌ๊ณ  ์‹ถ๋‹จ ๋ง์ด์ฃ ...

 

Python logging์„ ํ™œ์šฉํ•ด Flask์—์„œ loggingํ•˜๋Š” ๋ฐฉ๋ฒ•

Flask Logging ํ•˜๋Š” ๋ฐฉ๋ฒ•

jangseongwoo.github.io

์›ํ•˜๋Š” ๋กœ๊ทธ๋ฅผ ๋งŒ๋“œ๋Š” ๋‚ด์šฉ์€ ์ด ๊นƒํ—™ ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋‚ด์šฉ์„ ์กฐํ•ฉํ•ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋„ค์š”

import datetime
import logging
from flask import Flask, request

app = Flask(__name__)

logging.basicConfig(filename = "logs/test.log", level = logging.DEBUG)

def log(request, message):
    log_date = get_log_date()
    log_message = "{0}/{1}/{2}".format(log_date, str(request), message)
    logging.info(log_message)

def get_log_date():
    dt = datetime.datetime.now(timezone("Asia/Seoul"))
    log_date = dt.strftime("%Y%m%d_%H:%M:%S")
    return log_date

@app.route('/')
def hello():
    log(request, "hello route")
    return "hello"

if __name__ == '__main__':
    app.run(debug=True)

๊ทธ๋ฆฌ๊ณ  dependency ์„ค์ •์„ ์œ„ํ•œ requirements.txt์™€ ์ด ์•ฑ์„ Flask๋กœ ์‹คํ–‰ํ•ด์ฃผ๋Š” Dockerfile์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฑด docker compose ๋ฌธ์„œ์— ์žˆ๋Š” ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ์ผ์–ด์š”!

๊ทธ๋ฆฌ๊ณ  ์ตœ์ƒ์œ„ ํด๋”์— docker-compose-test.yml ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด์ค๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์ธ ๋‚ด์šฉ์€ ๋ฌธ์„œ์— ์žˆ๋Š”๊ฑธ ์ฐธ๊ณ ํ–ˆ์ง€๋งŒ, ํŒŒ์ผ ๊ฒฝ๋กœ๋Š” ์ €์—๊ฒŒ ๋งž๊ฒŒ ๋ฐ”๊ฟ”์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์ผ๋‹จ Filebeat ์—†์ด Flask๊ฐ€ ์ž˜ ๋œจ๊ณ  log๋ฅผ ์ž˜ ์ฐ๋Š”์ง€ ๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค.

version: "3.9"
services:
  web:
    build: ./test-server
    ports:
      - "5000:5000"

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•œ ๋’ค docker-compose up์„ ์‹คํ–‰ํ•ด์ค„ํ…๋ฐ,

์ง€๊ธˆ์€ ํŒŒ์ผ ์ด๋ฆ„์ด ๋””ํดํŠธ ๊ฐ’(docker-compose.yml)์ด ์•„๋‹ˆ๋ฏ€๋กœ

docker-compose -f docker-compose-test.yml up

์„ ์‹คํ–‰ํ•ด์ฃผ๋ฉด ๋œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๊ธ€์ด ๊ทธ๋žฌ์–ด์š”.

์‹คํ–‰ํ•˜๋ฉด... ์Œ ์ œ๋Œ€๋กœ ์„œ๋ฒ„๊ฐ€ ์•ˆ๋œจ๋„ค์š”

๋ญ”๊ฐ€ ์—๋Ÿฌ๊ฐ€ ๋‚˜์„œ ๊ณ ์น˜๊ธฐ ์ „์—๋Š” ๋–ด๋Š”๋ฐ ๊ทธ๊ฑธ ์ˆ˜์ •ํ•˜๊ณ  ๋‚˜๋‹ˆ๊นŒ ์•ˆ๋œน๋‹ˆ๋‹ค.

์ด๊ฒƒ์ €๊ฒƒ ํ…Œ์ŠคํŠธํ•ด๋ณด๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ๊ฒฐ๊ณผ๋Š” logging.basicConfig๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์ œ๋Œ€๋กœ ์„œ๋ฒ„๊ฐ€ ๋œฌ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  hello ์•ˆ์—์„œ log ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ธฐ๋ณธ ๋กœ๊ทธ ์™ธ์— ๋‹ค๋ฅธ ๋กœ๊ทธ๊ฐ€ ๋œจ๋Š”๋ฐ, INFO:werkzeug๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋กœ๊ทธ๊ฐ€ ๋œจ๋„ค์š”.

์™ ์ง€ ์ด ์นœ๊ตฌ๋ž‘ ์—ฐ๊ด€์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์•„ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

Logging — Flask Documentation (2.0.x)

Logging Flask uses standard Python logging. Messages about your Flask application are logged with app.logger, which takes the same name as app.name. This logger can also be used to log your own messages. @app.route('/login', methods=['POST']) def login():

flask.palletsprojects.com

๋งจ ๋งˆ์ง€๋ง‰์—

Werkzeug logs basic request/response information to the 'werkzeug' logger. If the root logger has no handlers configured, Werkzeug adds a StreamHandler to its logger.

๋ผ๊ณ  ํ•˜๋Š”๊ฑธ ๋ณด๊ณ  ์ด๊ฒƒ์ €๊ฒƒ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

werkzeug์— file handler๋ฅผ ๋ถ™์ด๋ฉด ๋ญ”๊ฐ€ ๋ ์ˆ˜๋„ ์žˆ์ง€ ์•Š์„๊นŒ.... ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด์„œ ์ด๋ž˜์ €๋ž˜ ๋‚œ๋ฆฌ๋ฅผ ์น˜๋ฉด์„œ

.

.

.

.

๊ทธ๋ฆฌ๊ณ  ์ˆ˜๋งŽ์€ ์‚ฝ์งˆ๋์— ๊ฒฐ๊ตญ ํ•ด๊ฒฐ์ฑ…์„ ์•Œ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค.

์ผ๋‹จ ์™„์„ฑ๋œ ์ฝ”๋“œ๋ถ€ํ„ฐ ๊ณต๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

import datetime
import logging
from flask import Flask, request
from pytz import timezone

app = Flask(__name__)

def log(request, message):
    log_date = get_log_date()
    log_message = 
    	"{{\n\tdate: {0}\n\trequest: {1}\n\tmessage: {2}\n}}"
        .format(log_date, str(request), message)
    logging.getLogger('my').info(log_message)

def get_log_date():
    dt = datetime.datetime.now(timezone("Asia/Seoul"))
    log_date = dt.strftime("%Y/%m/%d %H:%M:%S")
    return log_date

@app.route('/')
@app.route('/<name>')
def hello(name=''):
    log(request, "hello " + name)
    return "hello " + name

if __name__ == "app":
    fileHandler = logging.FileHandler('logs/test.log')
    myLogger = logging.getLogger('my')
    myLogger.setLevel(logging.INFO)
    myLogger.addHandler(fileHandler)

๋จผ์ € ๋ฌธ์ œ๊ฐ€ ๋๋˜ ์„œ๋ฒ„๊ฐ€ ๋œจ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š”

app์ด ์ œ๋Œ€๋กœ loading๋˜๊ธฐ ์ „์— logging.~~~ ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์ƒ๊ธด ๋ฌธ์ œ์˜€๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ทธ ๋ถ€๋ถ„์„ ์˜ฎ๊ฒจ์ค˜์•ผ ํ–ˆ๊ณ  ๊ตฌ๊ธ€๋ง์„ ํ•ด app.py๋ฅผ flask run์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด __name__์ด app์ด ๋œ๋‹ค๋Š” ๋‚ด์šฉ์„ ์ฐพ์•„ ๋งˆ์ง€๋ง‰ ๋ธ”๋ก์„ ๊ณ ์ณ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  'werkzeug' logger ๊ด€๋ จํ•ด์„œ๋Š”, ์ € ์นœ๊ตฌ์— ์ง์ ‘ file handler๋ฅผ ๋ถ™์ด๋ฉด ๋˜์ง€ ์•Š์„๊นŒ ํ–ˆ์ง€๋งŒ

root logger๋กœ ์ถ”์ •๋˜๋Š” ์นœ๊ตฌ์—๊ฒŒ๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋˜์–ด ์›ํ•˜์ง€ ์•Š๋Š” ๋กœ๊ทธ๊นŒ์ง€ ์ฐํžˆ๋Š” ์ƒํ™ฉ์ด ๋˜๋”๋ผ๊ตฌ์š”.

๊ทธ๋ž˜์„œ ์ƒˆ๋กœ์šด my logger๋ฅผ ๋งŒ๋“ค์–ด์„œ, ์—ฌ๊ธฐ์—๋งŒ file handler๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  log ๋ฉ”์†Œ๋“œ์—์„œ๋„ ์ด ์นœ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋‚ด์šฉ์„ ์ถœ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๋ฌผ์„ ๋ณด๋ฉด

test.log ํŒŒ์ผ
Flask Server Log

Flask Server Log์™€ test.log ํŒŒ์ผ ๋‚ด์šฉ์ด ์•„์ฃผ ์ž˜ ๋ถ„๋ฆฌ๋˜์–ด ์ ํžˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

ํฌ๋งทํŒ…์€ ๊ทธ๋ƒฅ ๋„ˆ๋ฌด ์‹ ๋‚˜์„œ ์ถ”๊ฐ€ํ•ด ๋ฒ„๋ ธ๊ตฌ์š”

๋ฌผ๋ก  ์ € ์ƒํƒœ๋กœ Filebeat๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด Logstash๊ฐ€ ์ž˜ ๋ฐ›์„์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ๐Ÿ˜

๊ทธ๋ฆฌ๊ณ  ๋„ˆ๋ฌด ์‹ ๋‚œ ๊น€์— route๋„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

<name>๊ณผ ๊ฐ™์€ parameter๋ฅผ ์“ฐ๋ฉด ์–ด๋–ค ๊ฐ’์ด ๋“ค์–ด์™€๋„ ๋ณ€์ˆ˜๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”๊ฒƒ ๊ฐ™๋”๋ผ๊ตฌ์š”.

๋กœ๊ทธ์—์„œ ๋ณด์‹œ๋‹ค์‹œํ”ผ URL์— localhost:5000/morgenmuffel ์ด๋ผ๊ณ  ์ ์œผ๋ฉด ๋กœ๊ทธ์—๋„ ์ด ๊ฐ’์ด ์ด์˜๊ฒŒ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

 

์‚ฌ์‹ค ํ•˜๋‹ค๊ฐ€ ์ค‘๊ฐ„์— ๋ฉ˜๋ถ•์ด ์™€์„œ ์นœ๊ตฌํ•œํ…Œ ํ•˜์†Œ์—ฐํ–ˆ๋Š”๋ฐ

๊ทธ๋ƒฅ file writer๋ฅผ ์“ฐ๋ฉด ์•ˆ๋˜๋ƒ๊ณ  ํ•˜๋Š”๊ฑธ ๋ณด๊ณ .....

์—ญ์‹œ ๋จธ๋ฆฌ๊ฐ€ ๋‚˜์˜๋ฉด ๋ชธ์ด ๊ณ ์ƒํ•œ๋‹ค๋Š”๊ฑธ ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ append ๋ชจ๋“œ๋กœ ํŒŒ์ผ์„ ์—ด์–ด์„œ ์“ธ๊ฑธ....

๊ทธ๋ž˜๋„ ๊ฒฐ๊ตญ ํ•ด๋ƒˆ์œผ๋‹ˆ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค..... ์ง€๊ธˆ ์‹œ๊ฐ ์ƒˆ๋ฒฝ 6์‹œ....

์›๋ž˜ Filebeat๊นŒ์ง€ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ๋„์ €ํžˆ ๋ชปํ•˜๊ฒ ๋„ค์š”.

์ œ๊ฐ€ ์›๋ž˜ ํฌ๋กฌ ํƒญ ๋งŽ์ด ๋œฌ๊ฑธ ์‹ซ์–ดํ•ด์„œ ๋งจ๋‚  ๋„๋ฉด์„œ ์ž‘์—…ํ•˜๋Š”๋ฐ

์˜ค๋Š˜์€ ๊ฑฐ์˜ ๋งˆํ”๊ฐœ๊ฐ€ ๋– ์žˆ๋„ค์š”!

์ € ์ค‘์— Filebeat ์—ฐ๊ฒฐํ•  ๋•Œ ๋ญ๊ฐ€ ํ•„์š”ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.... ํ•˜๋‚˜ํ•˜๋‚˜ ๋ณด๋ฉด์„œ ๋‚จ๊ฒจ๋†”์•ผ๊ฒ ์–ด์š”

์•„๋งˆ ๋‚ด์ผ, ์•„ ์˜ค๋Š˜์ด๊ตฐ์š” ์˜ค๋Š˜ ์ค‘์— Filebeat ์—ฐ๊ฒฐํ•˜๋ฉด์„œ ๋˜ ํ‘ธ๋…๊ธ€์„ ์ ์–ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!