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 를 도입하는게 좋다고 한다.)
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
'ElasticSearch & OpenSearch' 카테고리의 다른 글
[ElasticSearch] Settings, Mapping 설정하기 (0) | 2021.05.06 |
---|---|
[ElasticSearch] 한글 형태소 분석기 설치하기 (0) | 2021.05.03 |
[OpenSearch] dictionary 추가하기 (0) | 2021.04.23 |
[Docker-elk] docker-elk 세팅하고 띄우기 (0) | 2021.04.20 |
[OpenSearch] docker-elk 에서 AWS ES 로 옮기기 - 2. docker-logstash (0) | 2021.04.20 |