본문 바로가기
ElasticSearch & OpenSearch

[Filebeat] docker-filebeat 세팅하고 띄우기

by yonikim 2021. 4. 29.
728x90

Logstash 를 이용해 파일 input 을 다룰 수도 있지만 서버의 안정을 위하여 Filebeat 를 띄우기로 했다. 

 

※ Logstash vs Filebeat
Logstash 는 자원이 많이 필요한 대신 다룰 수 있는 input, output 종류가 많으며, filter 를 사용하여 로그를 분석하기 쉽게끔 구조화 된 형식으로 변환할 수 있다.
Filebeat 는 가벼운 대신 가능한 input, output 종류가 한정적이다. (최신 버전에서는 메시지 대기열을 디스크에 저장할 때 영구 대기열에 대해서도 지원한다고 한다!)
(참조: https://logz.io/blog/filebeat-vs-logstash/)


※ Filebeat 의 작동 방식은 어떻게 될까?
Filebeat를 시작하면 설정에서 지정한 로그데이터를 바라보는 하나이상의 inputs을 가진다. 지정한 로그 파일에서 이벤트(데이터발생)가 발생할 때마다 Filebeat는 데이터 수확기(harvester)를 시작한다. 하나의 로그 파일을 바라보는 각 havester는 새 로그 데이터를 읽고 libbeat에 보낸다. 그리고 libbeat는 이벤트를 집계하고 집계된 데이터를 Filebeat 설정에 구성된 출력으로 데이터를 보낸다.

 


 

현재는 로그가 많지 않아서 Filebeat -> Logstash -> Elasticsearch 의 구조를 이용해도 되지만, 추후에는 Kafka 를 도입해야 할거 같다. 

(왜냐하면 Logstash 와 Filebeat 는 sharding 이나 replication 등의 기능을 지원하지 않기 때문에 ELK 스택이 다운됐을 경우 로그가 전달되지 못한다. 따라서 전달되지 못한 로그를 buffer 에 가지고 있도록 하기 위해선 Kafka 를 도입하는게 좋다고 한다.)

 

1. docker-elk 세팅하고 띄우기

2. docker-filebeat 세팅하고 띄우기 

3. 한글 형태소 분석기 설치하기

4. Elasticsearch Settings, Mappings 설정하기

5. logstash filter plugins 다루기

 


docker-filebeat 세팅하고 띄우기


docker-elk 폴더 내부에 만들 수도 있지만, 우리의 경우 서비스를 AWS Elastic Container Service(ECS) 에 띄우는데 각 서비스 별로 Task Definition을 생성할 때 filebeat 컨테이너도 함께 추가해 줄 것이기 때문에 따로 폴더를 만들었다.

 

 

1. filebeat 폴더를 만든다.

$ mkdir filebeat
$ cd filebeat

 

2. Dockerfile 

FROM docker.elastic.co/beats/filebeat:7.10.0

COPY filebeat.yml /usr/share/filebeat/filebeat.yml
USER root

RUN mkdir /var/logs

RUN chown -R root /usr/share/filebeat

 

3. filebeat.yml 

filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - "/var/log/${service}/*.log"
    tags: ["${service}-log"]
    fields: {log_type: ${service}, index_type: ${service}-log}
  - type: log
    paths:
      - "/var/log/${service}/access/*.log"
    tags: ["${service}-access"]
    fields: {log_type: ${service}, index_type: ${service}-access}
    exclude_lines: ['.*ELB-HealthChecker.*']
  - type: log
    paths:
      - "/var/log/${service}/error/*.log"
    tags: ["${service}-error"]
    fields: {log_type: ${service}, index_type: ${service}-error} 

setup.dashboards.enabled: false  

output.logstash:
  hosts: ["${LOGSTASH_HOST}:5000"]
  # hosts: ["logstash:5000"] # docker-elk 내부에서 띄울 경우

 

* docker-elk 내부에 만들 경우 

4. 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
      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:
      # - "5044:5044"
      - "5000:5000"
      - "5000:5000"
      - "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

  filebeat:
    build:
      context: filebeat/
    volumes:
      - log-data:/var/log/server
    networks:
      - elk
    depends_on:
      - logstash

networks:
  elk:
    driver: bridge

volumes:
  elasticsearch:
  log-data:

 

5. 실행하기

5-1. filebeat 독자적으로 실행

$ docker build --tag filebeat .
$ docker run -d --name filebeat -v ${HOST_LOG_PATH}:/var/log/server filebeat

 

5-2. docker-elk 랑 함께 실행

$ docker-compose up -d --build --force-recreate
728x90