로그 수집기 Fluentd란?

fluentd logo

Fluentd를 업무에 활용할 일이 생겨, 간단히 Fluentd란 무엇인지 정리하고 어떤 컴포넌트로 구성이 되어있는지 작성해봅니다. 아래 내용은 공식 문서에 있는 내용을 정리하였습니다.


Fluentd란?

  • 단일화된 로깅 레이어를 위한, 오픈소스 데이터 수집기이다.
  • 다양한 소스들(input)로부터 메시지를 읽어올 수 있으며, 마찬가지로 다양한 출력(output)으로 메시지를 export 할 수 있다.
  • 해당 프로젝트는 TreasureData에 의해 만들어지고, 지원되고 있다.

Overview

fluentd architecture

  • fluentd는 log를 기본적으로 가장 공통적인 포맷인 JSON으로 다룬다.
  • 기본적으로 C로 작성되었으며, Thin Ruby Wrapper로 하여금 사용자들에게 유연함을 제공한다.
  • Ubuntu, CentOS, Window 등 다양한 운영체제에 맞게끔 다양한 설치 방법을 제공하고 있다.
 

Installation - Fluentd

Install by DEB Package (Debian/Ubuntu)

docs.fluentd.org

 


Fluentd 설정하기

Fluentd Event의 라이프사이클

  • setup -> input -> filter -> buffer -> match(output)의 전체적인 순서로 동작하는 라이프사이클을 살펴본다.

설정 파일 체크하기

  • Fluentd를 실행하기 위해, 각 라이프사이클에 해당하는 지정자들을 설정 파일(Configuration File)에 작성해야 한다. Fluentd 에이전트가 해당 설정 파일을 물고 실행하도록 해주어야 한다.
  • 기본적으로 Ubuntu의 경우, 설정 파일은 /etc/td-agent 경로 아래 td-agent.conf라는 파일로 존재한다.
  • Ubuntu에서 fluentd를 설치하는 경우, 관련 패키지 에러가 발생할 수도 있다.
    • 패키지 관련 에러가 발생하면, apt-get을 이용하여 에러 로그에서 나타내고 있는 해당 패키지를 설치해준다.
    • Ubuntu 버전에 따라 제공하는 Fluentd 버전이 다르므로, 잘 보고 설치한다.
  • td-agent 커맨드로 fluentd agent를 실행해볼 수 있다.
    • 백그라운드에서 데몬으로 수행하려면, -d 옵션과 --log 옵션을 추가하여 로그를 확인해볼 수 있다.

  • 다음 커맨드를 이용해서 데몬을 띄우고 확인해볼 수 있었다.
    • ps 커맨드를 활용해 확인해보면, fluentd agent 하나와 supervisor 한 개가 동시에 동작하고 있는 것을 확인할 수 있다.


설정 파일 작성하기

  • 설정 파일은, 각 모듈들을 한 군데 모아주는 역할을 한다고 생각하면 된다.
  • 설정 파일에는 다음과 같은 지정자들을 가질 수 있으며, 각 지정자들에 맞는 여러 플러그인들이 존재한다.
    • source : input 소스를 지정
    • match : output 목적지를 지정
    • filter : 이벤트 프로세싱 파이프라인을 설정
    • system : system-wide 한 속성 값을 지정
    • label : output과 filter에 대한 내부 라우팅을 설정
    • @include : 다른 외부 속성 파일을 포함할 수 있도록 설정

Event란?

Fluentd 내부에서 처리되는 데이터는, 이벤트(Event)로 구성되며 Fluentd의 이벤트는 다음과 같은 3가지 컴포넌트로 구성된다.

  1. tag : 이벤트가 어디서로부터 왔는지를 표시한다. 메시지 라우팅에 사용된다.
  2. time : 이벤트가 생성된 시간을 nano 초 단위로 특정한다.
  3. record : 실제 로그를 JSON 객체로 특정한다.
이벤트 컴포넌트 중에서 tag는 Fluentd 내부 Routing의 기본으로, 각 이벤트들이 설정된 tag에 맞는 태그로 흘러 들어갈 수 있게끔 구분해주는 역할을 한다.

플러그인들의 종류

Input Plugin : 데이터가 어디로부터 오는지 설정

  • input 플러그인은 source 태그 안에 정의한다.
  • 예로 http source를 살펴봅니다.
    • HTTP 8888 포트에 바인딩되어, 해당 포트의 Server를 지속해서 리스닝하고 있음을 표현한다.

  • input plugin의 종류에는 아래와 같은 다양한 종류의 플러그인들이 존재한다.

Filter Plugin : 이벤트를 어떤 프로세스로 처리하는지 설정

  • Filter는 @type과, 해당 타입에 해당하는 조건을 사용해서, 이벤트들을 통과시키거나, 거르는 역할을 수행한다.
  • Filter 지정자는 output(match) 지정자로 통과하기 전 필수로 거쳐야 한다.

  • 위의 설정을 예로 들면 test.cycle이라는 태그를 가진 이벤트 중에서, action key에서 logout이라는 패턴을 제외시키고, 제외되지 않은 메시지만을 match 태그로 전달할 수 있도록 한다.
  • 실제로 http에서 json={"action":"login", "user":2} 형태의 이벤트가 전달되었다고 하자.
    • filter에서 action key를 가진 메시지의 내용은 login으로, 걸러지지 않는다. 따라서 match 태그로 이동할 수 있다.
  • 위에서 알 수 있듯이, 이벤트는 위에서부터 아래로, 순서대로 처리됨을 알 수 있다.
  • 필터 플러그인에는 아래와 같은 종류의 플러그인이 존재한다.

Label Plugin: 이벤트 라우팅을 조금 더 세분화

  • Filter 조건이 다양해져 라우팅이 복잡해질 수 있다. 이런 경우, label을 활용하여 특정 태그로 바로 연결될 수 있도록 하는 참조자 역할을 수행한다.

  • 위의 설정 파일을 보면, 첫 번째 source 태그에 @label이 설정된 것을 확인할 수 있다. 밑으로 내려가 보면 역시 label 태그 안에, 특정한 filter와 match 태그가 존재하는 것을 볼 수 있다.
  • 눈치챘을 수도 있지만, 해당 source는 중간의 filter를 건너뛰고, 바로 @STAGING label이 붙어있는 태그로 이동한다.
  • 이렇듯 top-to-bottom 순서를 무시하고, 라우팅에 참조를 사용하여 변화를 줄 때 사용할 수 있다.

Buffer Plugin : 이벤트를 중간에 buffering

  • buffered mode는 memory 타입과 file 타입이 있다.
  • 실제로 match 태그에서 output 목적지로 이동하기 전 중간 저장소의 역할을 한다고 생각하면 된다.
  • 내부적으로 buffer가 동작하는지에 대한 설명은 추후 작성하도록 한다.

Output Plugin : 이벤트를 어디로 전달하는지 설정

https://docs.fluentd.org/output

 

Output Plugins - Fluentd

If the bottom chunk write out fails, it will remain in the queue and Fluentd will retry after waiting for several seconds (retry_wait). If the retry limit has not been disabled (retry_forever is false) and the retry count exceeds the specified limit (retry

docs.fluentd.org

  • output 플러그인은 match 태그 안에 정의한다.
  • tag와 매치되는 이벤트들을 다른 시스템으로 전달할 때 주로 사용한다.
  • v1.0부터 Buffering과 Flushing에 대한 설정을 match 태그 내부에 buffer 태그로 따로 정의하도록 변경되었다.

Tag에서 Wildcard 및 확장자 사용 팁

  • Fluentd에서 tag에는 패턴을 사용할 수 있다. 각 패턴이 어떻게 적용되는지 알아본다.
  • * : 하나의 태그를 의미한다.
    • a.* 는 a.b 와 같은 것을 의미. a.b.c와는 매치되지 않음
  • ** : 0 혹은 그 이상의 태그와 매치된다.
    • a.** 는 a, a.b, a.b.c 와 매치된다.
  • { X, Y, Z }는 X, Y, 혹은 Z가 match 패턴일 경우 매치된다.
    • { a, b }는 a 혹은 b와 매치된다.
    • a. { b, c }.* 혹은 a. {b, c ** } 등처럼 활용도 가능하다.
  • 복잡한 패턴은 정규식을 사용할 수도 있다.
  • #{}는 루비 표현식으로 평가한다.
  • 하나 이상의 매치 패턴은 공백으로 구분하여 설정 가능하다.

참조

 

Introduction - Fluentd

Service Discovery Plugins

docs.fluentd.org

 

잘못된 부분, 오역 있다면 댓글 부탁드립니다 ^^