layout: post title: Filebeat를 이용한 로그 데이터 수집 categories: [dev] author: 김동현 email: [email protected] date: 2021-10-29 tag:


추후 캐치클래스에 도입할 사용자 패턴 로그 기록을 위한 조사 과정에서 엘라스틱 스택(ELK)을 잠정적으로 선택하게 되었습니다. 엘라스틱 서치는 주로 오픈소스 검색 엔진으로 많이 사용하지만, 그 자체로도 훌륭한 일종의 NoSQL 이기 때문에 데이터 저장 용도로도 많이 사용되고 있습니다. 또한 추가 기능 제공을 위한 오픈소스 프로젝트들이 Logstash, Kibana로 통합되고 정리되면서 로그 데이터의 가공, 시각화도 한 번에 정리할 수 있다는 장점이 있습니다. 오류 추적 등 만약을 위한 로그가 아닌 인덱싱이 필요한 로그의 경우 엘라스틱 스택에 저장하면 쉽게 조회할 수 있습니다.

Logstash, Elasticsearch 만으로도 로그 수집이 가능하지만, Logstash는 비교적 무겁기도 하고 여러 마이크로서비스를 돌리거나 좀 더 유동적인 구성을 하고 싶은 경우 경량화 수집 프로그램인 Beats 를 이용하여 데이터를 전송하는 것이 좋습니다.

Beats 는 Metricbeat, Auditbeat, Filebeat 등 여러 종류가 있지만, 저희는 로그 파일의 변경을 추적하여 수집하는 것이 목적이기 때문에 Filebeat를 이용하게 되었습니다.

기본적인 로그 수집 프로세스는 다음과 같이 이루어집니다.

sam2.png

각각의 서버에 beat가 돌아가면서 데이터를 수집하고 이를 logstash 서버에 전송합니다. 곧바로 elasticsearch에 넣을 수도 있지만 logstash가 제공하는 여러 플러그인, 필터들을 사용하면 손쉽게 로그 데이터를 가공할 수 있습니다.

이제 elasticsearch에 저장된 데이터를 kibana로 시각화하여 파악하거나, 가공하여 사용할 수 있습니다.

실습은 docker 와 node.js(express.js)를 이용하여 간단한 예제를 통해 진행하였습니다.

FROM node:14 AS base
RUN mkdir /node-svr
WORKDIR /node-svr

COPY filebeat filebeat
RUN dpkg -i filebeat/filebeat-7.15.0-amd64.deb
COPY filebeat/filebeat.yml /etc/filebeat/filebeat.yml

COPY package.json .
COPY run.sh .

# ...

EXPOSE 3000
CMD ./run.sh

elastic.co 에서 리눅스용 filebeat 설치파일을 받아 dockerfile에서 복사 및 설치 후 미리 작업해 둔 환경설정 파일(filebeat.yml)을 붙여넣습니다. 별도로 설정하지 않는다면 기본적으로 filebeat는 /etc/filebeat 폴더에 설치되며, filebeat.yml 환경설정 파일이 생성됩니다.

공식 홈페이지에서는 설정할 수 있는 방식을 모두 기재해 놓은 reference 파일을 제공하고 있습니다. 여기서는 주의깊게 보아야 할 부분은 filebeat.inputs와 output.logstash 입니다.

filebeat.inputs:
  # input 타입
  - type: log

    # 적용
    enabled: true

    # 추적할 로그 폴더. Glob 형식.
    paths:
      - /node-svr/logs/*.log
# ...

# output.elasticsearch:
#   # Elasticsearch 호스트 목록
#   hosts: ["172.17.0.1:9200"]

output.logstash:
  # Logstash 호스트 목록
  hosts: ["호스트 주소"]

inputs 타입에서 Docker, AWS, Kafka, Redis 등 여러 옵션을 제공하지만, 여기서는 서버에서 생성하는 로그 파일 추적을 위해 log(또는 filestream)를 사용하겠습니다.