01. Fluentd란?
본 글은 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 플러그인은 먼저 이벤트를 버퍼에 저장한 후, 특정 조건을 만족하면 버퍼의 이벤트들을 목적지로 쓴다고 합니다.