ELK - docker

์šธ์ดยท2020๋…„ 7์›” 23์ผ
0

ELK-flask - ๋กœ๊ทธ ๋ถ„์„ํ•˜๊ธฐ

๐Ÿ’กELK ์Šคํƒ์„ ์ด์šฉํ•ด์„œ ํ”Œ๋ผ์Šคํฌ์˜ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ์ž

ELK logging with flask

ELK๋ž€?

ELK ๋Š”, Elastic search, Logstash, Kibana์˜ ์„ธ๊ฐ€์ง€ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์˜ ์•ฝ์ž์ด๋‹ค

๊ฐ ํ”„๋กœ์ ํŠธ๊ฐ€ ์—ฐ๋™๋˜์–ด ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ๋ถ„์„ ํˆด๋กœ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค

ํ”„๋กœ์ ํŠธ ๋‹ค์šด๋กœ๋“œ(์„ ํƒ)

$ git clone https://github.com/paullee714/ELK-docker-python.git

์›๋ณธ ํ”„๋กœ์ ํŠธ - https://github.com/deviantony/docker-elk

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

ELK-docker-python
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ docker-elk
โ”‚   โ”œโ”€โ”€ LICENSE
โ”‚   โ”œโ”€โ”€ README.md
โ”‚   โ”œโ”€โ”€ docker-compose.yml
โ”‚   โ”œโ”€โ”€ docker-stack.yml
โ”‚   โ”œโ”€โ”€ elasticsearch
โ”‚   โ”œโ”€โ”€ extensions
โ”‚   โ”œโ”€โ”€ kibana
โ”‚   โ””โ”€โ”€ logstash
โ”œโ”€โ”€ elk-flask
โ”‚   โ”œโ”€โ”€ __pycache__
โ”‚   โ”œโ”€โ”€ app.py
โ”‚   โ”œโ”€โ”€ elk_lib
โ”‚   โ””โ”€โ”€ route
โ”œโ”€โ”€ requirements.txt
โ””โ”€โ”€ venv
    โ”œโ”€โ”€ bin
    โ”œโ”€โ”€ lib
    โ””โ”€โ”€ pyvenv.cfg

ELK ์„ค์ •ํ•˜๊ธฐ - Docker

ํ”„๋กœ์ ํŠธ ํด๋” ์•ˆ์— ์žˆ๋Š” docker-elk ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋“ค์–ด๊ฐ€ docker-compose๋ฅผ ์‹คํ–‰์‹œ์ผœ์ค€๋‹ค

$ cd docker-elk

$ docker-compose build && docker-compose up -d

์‹คํ–‰๊ฒฐ๊ณผ

โžœ  docker-elk git:(develop) docker-compose build && docker-compose up -d
Building elasticsearch
Step 1/2 : ARG ELK_VERSION
Step 2/2 : FROM docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION}
 ---> f29a1ee41030
Successfully built f29a1ee41030
Successfully tagged docker-elk_elasticsearch:latest
Building logstash
Step 1/2 : ARG ELK_VERSION
Step 2/2 : FROM docker.elastic.co/logstash/logstash:${ELK_VERSION}
 ---> fa5b3b1e9757
Successfully built fa5b3b1e9757
Successfully tagged docker-elk_logstash:latest
Building kibana
Step 1/2 : ARG ELK_VERSION
Step 2/2 : FROM docker.elastic.co/kibana/kibana:${ELK_VERSION}
 ---> f70986bc5191
Successfully built f70986bc5191
Successfully tagged docker-elk_kibana:latest
Starting docker-elk_elasticsearch_1 ... done
Starting docker-elk_kibana_1        ... done
Starting docker-elk_logstash_1      ... done

docker ps๋กœ ํ™•์ธ ํ•ด ์ฃผ์ž

โžœ  docker-elk git:(develop) docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                                                                              NAMES
ae318f58a9af        docker-elk_logstash        "/usr/local/bin/dockโ€ฆ"   2 days ago          Up 47 seconds       0.0.0.0:5000->5000/tcp, 0.0.0.0:9600->9600/tcp, 0.0.0.0:5000->5000/udp, 5044/tcp   docker-elk_logstash_1
00a032b5c5c4        docker-elk_kibana          "/usr/local/bin/dumbโ€ฆ"   2 days ago          Up 47 seconds       0.0.0.0:5601->5601/tcp                                                             docker-elk_kibana_1
3b62a3ba2e21        docker-elk_elasticsearch   "/usr/local/bin/dockโ€ฆ"   2 days ago          Up 47 seconds       0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp                                     docker-elk_elasticsearch_1

ELK port ์„ค์ •

docker ps ๋กœ ํ™•์ธ ํ•ด ๋ณด์•˜์„ ๋•Œ ๊ฐ๊ฐ์˜ port๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

Elastic Search : 9200, 9300
Logstash : 5000, 9600
Kibana : 5601

docker-compose.ymlํŒŒ์ผ๊ณผ ๊ฐ configํŒŒ์ผ์„ ํ™•์ธํ•ด๋ณด์ž

์•„๋ž˜์˜ docker-compose.yml ํŒŒ์ผ์„ ๋ณด๋ฉด, ๊ฐ๊ฐ service๋“ค์˜ configํŒŒ์ผ๋“ค์˜ ์„ค์ •์„ ๊ฐ€์ ธ์™€์„œ ์„ค์ •ํ•œ๋‹ค.

Elastic Search : /elasticsearch/config/elasticsearch.yml
Logstash : /logstash/config/logstash.yml
Kibana : /kibana/config/kibana.yml

  • docker-elk docker-compose.yml file

      # /ELK-docker-python/docker-elk/docker-compose.yml
      version: '3.2'
    
      services:
        elasticsearch:
          build:
            context: elasticsearch/
            args:
              ELK_VERSION: $ELK_VERSION
          volumes:
            - type: bind
              source: ./elasticsearch/config/elasticsearch.yml
              target: /usr/share/elasticsearch/config/elasticsearch.yml
              read_only: true
            - type: volume
              source: elasticsearch
              target: /usr/share/elasticsearch/data
          ports:
            - "9200:9200"
            - "9300:9300"
          environment:
            ES_JAVA_OPTS: "-Xmx256m -Xms256m"
            ELASTIC_PASSWORD: changeme
            # Use single node discovery in order to disable production mode and avoid bootstrap checks
            # see https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
            discovery.type: single-node
          networks:
            - elk
    
        logstash:
          build:
            context: logstash/
            args:
              ELK_VERSION: $ELK_VERSION
          volumes:
            - type: bind
              source: ./logstash/config/logstash.yml
              target: /usr/share/logstash/config/logstash.yml
              read_only: true
            - type: bind
              source: ./logstash/pipeline
              target: /usr/share/logstash/pipeline
              read_only: true
          ports:
            - "5000:5000/tcp"
            - "5000:5000/udp"
            - "9600:9600"
          environment:
            LS_JAVA_OPTS: "-Xmx256m -Xms256m"
          networks:
            - elk
          depends_on:
            - elasticsearch
    
        kibana:
          build:
            context: kibana/
            args:
              ELK_VERSION: $ELK_VERSION
          volumes:
            - type: bind
              source: ./kibana/config/kibana.yml
              target: /usr/share/kibana/config/kibana.yml
              read_only: true
          ports:
            - "5601:5601"
          networks:
            - elk
          depends_on:
            - elasticsearch
    
      networks:
        elk:
          driver: bridge
    
      volumes:
        elasticsearch:

Logstash ์˜ ๋กœ๊น…์„ค์ •

flask์˜ ๋กœ๊ทธ๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์€ ELK์Šคํƒ ์ค‘, Logstash ์ด๋‹ค.

Logstash โ€”> Elastic Search โ€”> Kibana(์กฐํšŒ/๋ถ„์„)

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Logstash์˜ ์„ค์ •์ด ์ค‘์š”ํ•˜๋‹ค.

ES์˜ ์ธ๋ฑ์Šค๋ฅผ 'elk-logger' ๋กœ ์„ค์ •ํ•˜๊ณ  ๋กœ๊ทธ๋ฅผ ๋ชจ์•„ ๋ด…์‹œ๋‹ค

$ vim /ELK-docker-python/docker-elk/logstash/pipeline/logstash.conf
input {
    tcp {
        port => 5000
    }
}

## Add your filters / logstash plugins configuration here

output {
    elasticsearch {
        hosts => "elasticsearch:9200"
        user => "elastic"
        password => "changeme"
        index => "elk-logger"
    }
}

๊ฐ„๋‹จํ•œ flask ์•ฑ ๋งŒ๋“ค๊ธฐ

  • requirements.txt

      certifi==2020.4.5.1
      click==7.1.2
      elasticsearch==7.7.1
      Flask==1.1.2
      itsdangerous==1.1.0
      Jinja2==2.11.2
      MarkupSafe==1.1.1
      python-dotenv==0.13.0
      python-json-logger==0.1.11
      python-logstash==0.4.6
      python3-logstash==0.4.80
      urllib3==1.25.9
      Werkzeug==1.0.1

requirements.txt๋ฅผ ๋‚จ๊ฒจ๋‘์—ˆ๋‹ค. ๊ฐ€์ƒํ™˜๊ฒฝ์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด flask๋ฐ ์—ฌ๋Ÿฌ ๊ธฐํƒ€ ๋ชจ๋“ˆ๋“ค์„ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

flask logger ์„ค์ •

import logging, logstash

log_format = logging.Formatter('\n[%(levelname)s|%(name)s|%(filename)s:%(lineno)s] %(asctime)s > %(message)s')

def create_logger(logger_name):
    logger = logging.getLogger(logger_name)
    if len(logger.handlers) > 0:
        return logger  # Logger already exists

    logger.setLevel(logging.INFO)
    **logger.addHandler(logstash.TCPLogstashHandler('localhost', 5000, version=1))**

    return logger

logger๋ฅผ ์„ค์ • ํ•˜๋Š” ๋ถ€๋ถ„ ์ค‘, addHandler(logstash.TCPLogstashHandler('localhost',5000,version=1)) ์ด logstash๋กœ ํ•ด๋‹นํ•˜๋Š” ๋กœ๊ทธ๋ฅผ ๋ณด๋‚ด๊ฒ ๋‹ค ๋ผ๋Š” ์–˜๊ธฐ์ด๋‹ค.

@elk_test.route('/', methods=['GET'])
def elk_test_show():

    logger = elk_logger.create_logger('elk-test-logger')
    logger.info('hello elk-test-logstash')

    return "hello world!"

๋กœ๊น…์„ ๋‚จ๊ธฐ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋กœ๊ทธ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋œ๋‹ค.

kibana์—์„œ ํ™•์ธํ•˜๊ธฐ

๊ฐ๊ฐ์˜ configํŒŒ์ผ์—์„œ id,pw๋ฅผ ์„ค์ • ํ•œ ๋Œ€๋กœ ๋กœ๊ทธ์ธ ํ•˜๋ฉด ๋œ๋‹ค.

์„ค์ •ํŒŒ์ผ์„ ๋”ฐ๋กœ ๋ฐ”๊พธ์ง€ ์•Š์•˜๋‹ค๋ฉด, id๋Š” elastic, pw๋Š” changeme ์ด๋‹ค

๋กœ๊ทธ์ธ ํ›„, index pattern๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

$ docker-compose down

์œ„์˜ ๋ช…๋ น์–ด๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒ ํ•ด์ค€๋‹ค :D

profile
๊ฐœ๋ฐœ์„ ๊ฐœ๋ฐœ๊ฐœ๋ฐœ

0๊ฐœ์˜ ๋Œ“๊ธ€