Log/fluentd

01. Fluentd란?

우라릭 2022. 10. 8. 18:20

본 글은 https://docs.fluentd.org/을 번역/요약/정리/사견 추가한 글입니다.

 

1. Fluentd란?

Fluentd는 통합된 로깅 레이어를 위한 오픈소스 데이터 수집기입니다. Fluentd는 데이터 수집과 소비를 통합시켜줍니다.특히 125개 이상의 시스템을 지원함으로써 모든 것을 로깅할 수 있게 해줍니다.

 

 

Fluentd는 로그를 JSON으로 취급합니다. 그리고 fluent의 확장성도 현업에서 이미 인정되었다고 합니다. Fluentd의 가장 큰 고객은 5만 여개 이상의 서버로부터 로그를 수집하고 있답니다.

2. Use cases (사용 사례)

  • 오픈소스(elasticsearch, kibana)만을 이용해 Splunk와 같은 데이터(로그) 검색
  • 데이터를 감지해서 경고 메시지 이메일로 보내기
  • DB나 검색엔진으로 로그 보내버리기

3. Fluentd는 이벤트를 어떻게 처리할까?

설정 파일은 모든걸 묶는 아주 중요한 곳입니다. 예제에선 in_http, out_stdout을 쓸거랍니다.

in_http를 이용해 HTTP 요청을 받아봅시다.

<source>
  @type http
  port 8888
  bind 0.0.0.0
</source>

이제 표준 출력에 이벤트를 출력할 수 있게 매칭 규칙을 정해봅시다

<match test.cycle>
  @type stdout
</match>

이제 /test.cycle로 요청을 보내면 다음과 같은 로그가 출력됩니다.

2019-12-16 18:58:27.888557000 +0900 test.cycle: {"action":"login","user":2}
 

3.1. 이벤트 구조

Fluentd의 이벤트는 3개의 구성요소를 포함합니다. 

  • tag : 이벤트가 온 곳(origin)을 나타냅니다. 메시지를 라우팅할 때 사용합니다.
  • time: 나노초 단위로 이벤트가 언제 일어났는지 알려줍니다.
  • record : 실제 로그를 JSON 형태로 나타냅니다.

input 플러그인은 데이터 소스로부터 fluentd 이벤트를 만들어냅니다. 예를 들어, in_tail은 텍스트로부터 이벤트를 만들어냅니다. e.g.

192.168.0.1 - - [28/Feb/2013:12:00:00 +0900] "GET / HTTP/1.1" 200 777

to

tag: apache.access # set by configuration
time: 1362020400.000000000 # 28/Feb/2013:12:00:00 +0900
record: {"user":"-","method":"GET","code":200,"size":777,"host":"192.168.0.1","path":"/"}

3.2. 이벤트 처리

3.2.1. Filters

필터는 이벤트를 통과시키거나 거부하는 역할을 합니다. 다음과 같은 설정 파일이 있다면,

<source>
  @type http
  port 8888
  bind 0.0.0.0
</source>

<filter test.cycle>
  @type grep
  <exclude>
    key action
    pattern ^logout$
  </exclude>
</filter>

<match test.cycle>
  @type stdout
</match>

다음은 액션 키에서 logout 문자열을 가진 이벤트를 제외시킵니다. 여기서 action은 JSON record의 키 중 하나로 생각할 수 있습니다.

3.2.2. Labels

레이블은 설정 파일의 복잡함을 풀고 새로운 라우팅 섹션을 정의하게 해준다 합니다. 다음과 같은 설정 파일이 있다면

<source>
  @type http
  bind 0.0.0.0
  port 8888
  @label @STAGING
</source>

<filter test.cycle>
  @type grep
  <exclude>
    key action
    pattern ^login$
  </exclude>
</filter>

<label @STAGING>
  <filter test.cycle>
    @type grep
    <exclude>
      key action
      pattern ^logout$
    </exclude>
  </filter>

  <match test.cycle>
    @type stdout
  </match>
</label>

아래 그림처럼 레이블이 맞는 필터로만 이벤트를 흘러가게 하고 다른 필터는 흐름에서 제외시킬 수 있습니다. 즉, 설정 파일의 top-to-down 형식으로 내려가는 이벤트의 흐름을 바꿀 수 있게 합니다.

3.2.3. Buffers

예제에선 버퍼없이 stdout으로 바로 출력을 때려버렸지만 실제 환경에선 보통 버퍼를 사용한답니다. buffered mode를 사용하는 output 플러그인은 먼저 이벤트를 버퍼에 저장한 후, 특정 조건을 만족하면 버퍼의 이벤트들을 목적지로 쓴다고 합니다.