Computer Science

[Fluentbit] 로그데이터 수집하기

팀 프로덕트에서 로그 수집기로 사용하는 툴인 fluent-bit을 소개하려고 한다.

 

fluent-bit란?

 

로그 데이터를 수집, 필터링, 변환해서 대상 시스템으로 전달해주는 오픈소스 데이터 수집 툴(data collector)이다. 서버에 실시간으로 쌓이는 log파일들을 지정해서 수집 하며, http, tcp 통신을 통해 fluentd로 직접 전송이 가능하다.

다양한 Input, Output 플러그인을 지원하고 있고, 로그 데이터를 다양한 형식으로 전송할 수 있다. Elasticsearch, InfluxDB, Kafka,AWS S3등의 데이터 저장소와 통합하여 사용할 수 있으며, 필자는 fluent-bit으로 로그데이터를 수집하여 S3로 전송하도록 구성하여 사용하고 있다.

 

궁금했던 것

 

1. Fluent-bit와 Fluentd랑 같은 거 아닌가? 뭐가 다르지?

fluent-bit은 fluentd의 경량화 버전. In one word, Fluent Bit is designed for small footprint while Fluentd is designed for flexibilities.

         
servers   사용범위 containers / servers / embedded systems  
C & Ruby   개발된 언어 C  
~40MB   메모리 ~450KB  

더 자세한 비교는 fluentd의 FAQ에서 확인 가능하다.

👉🏻 그렇다면 우리 팀은 왜 fluent-bit을 선택했는가?
현재는 고사양 컴퓨터를 프로덕트에서 활용하고 있지만, 궁극적으로는 하드웨어 경량화도 진행될 예정임. 로그 수집기도 경량화된 버전이 필요했다. 

 

2. 그럼 td-agent-bit은 뭐지?

Linux에서의 fluent-bit 패키지를  td-agent-bit이라고 한다. (참고)

 

 

설치 ( Ubuntu 기준 )

 

🍯 버전이 업데이트되면서 바뀔 수도 있으므로, 항상 official docs를 참고하길 추천한다.

1. fluent-bit의 GPGkey를 로컬 keyring에 추가

wget -qO - https://packages.fluentbit.io/fluentbit.key | sudo apt-key add -

 

2. fluent-bit APT서버를 로컬 source.lists에 등록

echo "deb https://packages.fluentbit.io/ubuntu/bionic bionic main" | sudo tee -a /etc/apt/sources.list

source.list 파일 가장 아래에 추가하면, apt-get update 명령어 실행으로 패키지 목록을 업데이트한 후 fluent-bit 저장소에서 패키지 설치 및 업그레이드를 할 수 있게 된다.

docs에서는 수동으로 추가하라고 안내하므로, deb 명령어 실행 후, 수동으로 진행해도 좋고, 자동화를 하려고한다면 I/O redirection & tee를 이용하면 된다. 

 

3. 패키지 목록 업데이트 & 최신 td-agent-bit 설치

sudo apt-get update
sudo apt-get install td-agent-bit

 

4. td-agent-bit 서비스 시작

# sudo systemctl enable td-agent-bit
sudo service td-agent-bit start

로그 콜렉터의 특성상, 재부팅시에도 서비스가 자동으로 실행되어 백그라운드에서 돌아가게해야하므로 서비스로 등록 & 실행시키면 된다.

🍯 필자의 경우에는 enable을 시켜주기 전까지 service start가 되지않았다. start가 잘 되지 않는다면, sudo service td-agent-bit status를 통해 제대로 enable되어있는지 확인해보자. ( 2번째 라인의 Loaded에서 확인 가능. disable되어있으면 빨간 글씨로 disabled라고 뜬다. )

● td-agent-bit.service - TD Agent Bit
     Loaded: loaded (/lib/systemd/system/td-agent-bit.service; enabled; vendor preset: enabled)
     Active: active (running) since ***** KST; *days ago
   Main PID: *** (td-agent-bit)
      Tasks: * (limit: *)
     Memory: *.*M
     CGroup: /system.slice/td-agent-bit.service
             └─**** /opt/td-agent-bit/bin/td-agent-bit -c /etc/td-agent-bit/td-agent-bit.conf

 

 

configuration

 

🍯 conf파일 수정시, td-agent-bit 서비스 재시작을 잊지말자.

 

fluent-bit은 configuration file을 직접 정의해서 서비스가 작동할 수 있게 한다. configuration schema는 sections, entries(key/value), indented configuration mode 컨셉으로 정의된다. 

  • sections: conf파일에서 대괄호로 감싸진 제목을 의미한다. 
  • entries: key, value를 포함하는 텍스트 라인부분을 지칭한다.
  • indented confguration mode: 엄격한 indentented mode(들여쓰기 모드)를 따른다. 4개의 들여쓰기 권장! 

각각의 컨셉에 대한 자세한 규칙과 설명은 역시 docs 참고.

 

fluent-bit을 설치하면 기본으로 깔리는 conf 파일 (1.8.12 버전 기준)을 통해, 어떤 sections, entries가 주로 사용되고 어떤 의미인 지 살펴보자.

1. SERVICE
service 섹션은 global properties로, 서비스의 전반적인 구성을 설정할 수 있다. 

[SERVICE]
    # Flush
    # =====
    # set an interval of seconds before to flush records to a destination
    flush        1

    # Daemon
    # ======
    # instruct Fluent Bit to run in foreground or background mode.
    daemon       Off

    # Log_Level
    # =========
    # Set the verbosity level of the service, values can be:
    #
    # - error
    # - warning
    # - info
    # - debug
    # - trace
    #
    # by default 'info' is set, that means it includes 'error' and 'warning'.
    log_level    info

    # Parsers File
    # ============
    # specify an optional 'Parsers' configuration file
    parsers_file parsers.conf

    # Plugins File
    # ============
    # specify an optional 'Plugins' configuration file to load external plugins.
    plugins_file plugins.conf

    # HTTP Server
    # ===========
    # Enable/Disable the built-in HTTP Server for metrics
    http_server  Off
    http_listen  0.0.0.0
    http_port    2020

    # Storage
    # =======
    # Fluent Bit can use memory and filesystem buffering based mechanisms
    #
    # - https://docs.fluentbit.io/manual/administration/buffering-and-storage
    #
    # storage metrics
    # ---------------
    # publish storage pipeline metrics in '/api/v1/storage'. The metrics are
    # exported only if the 'http_server' option is enabled.
    #
    storage.metrics on

    # storage.path
    # ------------
    # absolute file system path to store filesystem data buffers (chunks).
    #
    # storage.path /tmp/storage

    # storage.sync
    # ------------
    # configure the synchronization mode used to store the data into the
    # filesystem. It can take the values normal or full.
    #
    # storage.sync normal

    # storage.checksum
    # ----------------
    # enable the data integrity check when writing and reading data from the
    # filesystem. The storage layer uses the CRC32 algorithm.
    #
    # storage.checksum off

    # storage.backlog.mem_limit
    # -------------------------
    # if storage.path is set, Fluent Bit will look for data chunks that were
    # not delivered and are still in the storage layer, these are called
    # backlog data. This option configure a hint of maximum value of memory
    # to use when processing these records.
    #
    # storage.backlog.mem_limit 5M
  • Flush: flush되는 간격을 초 단위로 설정.
  • Daemon: yes, on, no, off로 설정. 데몬 실행 여부 설정.
  • Log_File: 로그파일을 절대경로로 지정. ( 제대로 수집/전송되었는 지를 남겨주는 로그 파일 )
  • Log_Level: 로깅 상세 수준을 error, warning, info, debug, trace중에 골라서 지정. ( 당연히 info를 설정하면, error, warning, info가 포함된다. )
  • Parsers_file: parsers.conf 파일 지정
  • storage.path: 파일시스템 버퍼를 저장할 위치를 절대 경로 지정.
  • storage.backlog.mem_limit: fluentbit가 백로그(버퍼)에 사용할 수 있는 최대 메모리 양. ( 필자의 경우, 버퍼메모리가 부족하여 로그가 유실된 경우가 있었다. 충분한 테스트 후 잘 설정하는 것을 추천한다. )
  • etc

 

2. INPUT

input plugin관련 source를 정의한다. INPUT섹션에서는 자체 key 추가가 가능하다.

 

[INPUT]
    name cpu
    tag  cpu.local

    # Read interval (sec) Default: 1
    interval_sec 1
  • name: input plugin의 이름
  • tag 

필자의 경우, fluentbit이 쌓인 로그를 수집해서 S3 버킷으로 업로드 해주기때문에, 아래와 같이 지정했다.

[INPUT]
    Name              tail
    Tag               test-log.s3
    Path              /home/ubuntu/test/dummy.log
    Mem_Buf_Limit     2MB
    Skip_Long_Lines   On
    Refresh_Interval  5.0
    storage.type      filesystem

 

3. FILTER

이벤트를 필터링, 변환할 수 있도록 다양한 플러그인을 구성할 수 있다. input과 동일하게 자체 conf key 추가 가능하다.

[FILTER]
    Name  stdout
    Match *

필자는 parser플러그인을 해당 섹션에서 구성했다. s3 이벤트에 필터를 적용(Match)하도록 했고, JSON_PARSE 파서를 사용하도록 한다. 파싱 이전의 raw data를 제거하며, 파싱된 필드를 이벤트에 추가시에 기존 필드 이름을 유지하도록 구성했다. 마지막으로 파싱된 결과를 log 필드에 저장한다.

[FILTER]
    Name parser
    Match *.s3
    Key_Name log
    Parser JSON_PARSE
    Reserve_Data Off
    Preserve_Key On

 

4. OUTPUT

data를 전송하는 대상을 정의하는 섹션이다.

[OUTPUT]
    name  stdout
    match *

예시는 출력 플러그인으로 stdout을 지정, 모든 이벤트에 대해 output 수행하도록 구성되었다. 

 

 

겪었던 issue
: 버전 업데이트를 하면서 conf파일이 날아가버린 건에 대하여

 

버전 업데이트 진행 중 td-agent-bit.conf 파일이 디폴트 파일과 충돌되므로, 기존 사용 파일을 사용할 것인지를 묻는다. 이 설명을 제대로 읽지않고 Y를 눌러버린 필자는, 디폴트 파일로 원복이 된 경우가 있었다. 실 운영 서버에서 업그레이드를 진행한다면 유의해야한다.

Configuration file '/etc/td-agent-bit/td-agent-bit.conf'
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.
What would you like to do about it ?  Your options are:
Y or I  : install the package maintainer's version
N or O  : keep your currently-installed version
D     : show the differences between the versions
Z     : start a shell to examine the situation
The default action is to keep your current version.
*** td-agent-bit.conf (Y/I/N/O/D/Z) [default=N] ?

 

 

회고

 

Fluent-bit을 팀에서 사용한 지 1년반정도가 되었는데, 사용할 줄만 알고 아직도 어떻게 구성되고 어떻게 작동하는 지를 모르고 있었음을.. 글쓰면서 느꼈다. 이번 글을 작성하면서는 아직 이 내용까지는 살펴볼 시간이 없었는데, 더 살펴보고 글을 추가로 작성해보려고 한다. (참고)