Fluentd 구성 요소
![](https://blog.kakaocdn.net/dn/dp4f1Y/btr3WcBYyxD/NByszplug0GwjZej4XOAr0/img.png)
Fluentd 구조
- Input : 로그 수집 플러그인. HTTP, tail, TCP 등 기본 플러그인 외에도 확장 플러그인을 통해 다양한 서버나 애플리케이션으로부터 다양한 포맷의 데이터를 수집할 수 있다.
- Parser (Optional) : Input 플러그인을 통해 데이터를 읽어도 Fluentd에서 지원하지 않는 데이터 포맷인 경우, 그 데이터를 Parsing 하기 위해 사용할 수 있는 플러그인. RE 기반으로 스트링을 parsing 하는 플러그인뿐만 아니라 apache, nginx, syslog 등의 다양한 포맷의 데이터를 Parsing 할 수 있는 플러그인들이 존재한다.
- Filter (Optional) : Input 플러그인을 통해 읽어들인 데이터를 Output 플러그인으로 보내기 전에 필터링할 수 있는 플러그인. 필터링, 데이터 필드 추가, 삭제, 마스킹 등이 가능하다.
- Output : Input 플러그인과 반대로 필터링된 데이터를 데이터 저장소에 저장할 수 있도록 하는 플러그인.
- Formatter (Optional) : Output 플러그인을 통해 데이터를 저장소에 쓸 때, Formatter를 이용하면 쓰는 데이터의 포맷을 정의할 수 있다.
- Buffer (Optional) : Input에서 들어온 데이터를 바로 Output으로 보내는 것이 아니라 중간에 Buffer를 둬서 Throttling을 할 수 있다. File과 Memory 둘 다 사용 가능하다.
이벤트 구조
- tag : 이벤트가 어디서 발생했는 지에 대한 정보. 메시지 라우팅에 사용된다.
- time : 이벤트가 발생한 시간. nano초 단위.
- record : JSON object의 실제 log.
- input의 'tail'이라는 plugin 사용 예제
- Apache log 가 발생했을 경우
192.168.0.1 - - [28/Feb/2013:12:00:00 +0900] "GET / HTTP/1.1" 200 777
- Fluentd 이벤트
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":"/"}
Buffer 구조
Buffer에는 로그 데이터를 분리하는 Tag 단위로 chunk가 생성이 된다. chunk에 데이터가 쌓여서 buffer_chunk_limit 만큼 쌓여서 Full 이 되거나, 설정값에 정의된 flush_interval 주기가 되면 로그 저장소로 로그를 쓰기 위해 Queue로 전달이 된다.
Queue에서는 데이터를 읽어서 저장소에 데이터를 쓰는데, 네트워크 에러나 저장소 에러로 로그를 쓰는 것에 실패하면 retry_wait 시간만큼 대기를 한 후에 다시 쓰기를 시도한다. 또 실패하면 기다린 시간의 2배만큼 기다리고 시도하는 방식으로 retry_limit 횟수까지 계속 진행한다. Queue가 꽉 차게 돼버리면 이에 대한 정책을 설정할 수 있는데, exception과 block 두 가지 모드가 있다.
- exception : BufferQueueLimitError를 발생시킨다.
- block : BufferQueueLimitError 가 해결될 때까지, Input plugin을 중지시킨다. 즉, 로그 수집을 더 이상 진행하지 않는다.
Queue가 차버렸을 때 다른 처리 방법으로는 Secondary Output을 지정해서, 다른 저장소에 로그를 지정하는 방법이 있다.
Fluentd 설정 파일
<system> 디렉티브
- Fluentd 코어 부분의 동작을 결정하는 디렉티브
- Fluentd 자체의 동작 및 로그 출력 부분의 상세 설정을 커스터마이즈 할 수 있다.
@include 디렉티브
- 설정을 외부로부터 읽어 들이기 위한 디렉티브
- 로컬 파일뿐 아니라 설정 배포 서버에서 http 프로토콜로 받는 것도 가능.
@include [URL 또는 파일 경로로 외부로부터 읽을 설정을 지정]
# 절대 경로
@include /path/to/config.conf
# 상대 경로, 호출하는 쪽의 설정 파일이 있는 디렉토리를 출발점으로 함
@include extra.conf
# 여러 개의 파일을 읽을 경우
@include config.d/*.conf
# HTTP 통신으로 설정을 읽을 경우
@include http://127.0.0.1/fluentd.conf
<source> 디렉티브
- 메시지의 입력 부분이 되는 Input 플러그인을 지정하고, Input 플러그인에게 전달할 설정을 하는 디렉티브
- 포트를 열고 메시지를 기다리거나 로그 파일의 내용이 추가되는 것을 감시하거나 프로그램을 일정 간격으로 실행해서 메시지를 읽거나 하는 플러그인 설정을 하고 싶을 때 사용.
- Input 플러그인에서 [tag, time, record] 총 3개의 요소로 구성된 메시지가 Fluentd로 보내져, 태그와 라벨을 사용해서 라우팅을 한다.
<source>
@id [plugin_id를 정의]
@type [플러그인 이름] # 필수 항목
tag [출력 태그] # 필수 항목
@label @[라벨]
[플러그인의 옵션]
</source>
주로 사용되는 플러그인
forward
- Fluentd 클라이언트로부터 메시지를 받거나, 다른 Fluentd 인스턴스로부터 메시지를 받을 때 사용.
- Fluentd 클라이언트로서 동작하는 로거 클래스(Logger class)는 Fluent Logger라고 하며 여러 언어에서 라이브러리 제공.
- 받은 메시지를 다른 Fluentd 인스턴스로 전달하고 싶을 때는 Output 플러그인의 forward 사용
tail
- 로그 파일에 추가되는 내용을 차례대로 읽는 플러그인.
- 로그 로테이트(log rotate)가 되더라도, 적절히 감지하여 Linux의 tail -F 커맨드에 가까운 동작을 한다.
- 로그 로테이트 : Linux 시스템에서 로그를 관리하기 위한 프로그램
- 디스크를 차지하는 로그를 줄이기 위해 로그를 삭제하는 등의 행위를 rotate라고 함.
- 로그 로테이트 : Linux 시스템에서 로그를 관리하기 위한 프로그램
- Fluentd를 재실행하더라도 중복해서 읽지 않고 이어서 읽는다.
- pos_file 옵션을 통해 파일의 inode 번호와 offset 위치를 파일에 저장해 둠으로써 가능하다.
<filter> 디렉티브
- 특정 태그에 Filter 플러그인을 호출해서 데이터 처리를 하도록 설정하는 디렉티브.
- 태그 변경은 불가능하다.
<filter [매치하는 태그]>
@type [플러그인 이름]
[플러그인의 옵션]
</filter>
<match> 디렉티브
- 로그의 출력 장소를 정하는 디렉티브.
- 임의의 태그에 해당하는 로그를 type 파라미터로 지정한 Output 플러그인으로 출력.
- Cloud Storage, DB, KVS, Queueing 시스템 등 연계하는 써드파티 플러그인이 많다.
<match [매칭하는 태그]>
@id [plugin_id를 정의]
@type [플러그인 이름]
@label @[라벨명] #옵션
[플러그인의 옵션]
</match>
- 태그의 패턴 정의
- *는 하나의 태그 요소와 일치
- **는 0개 이상의 태그 요소와 일치
- {X, Y, Z}는 X와 Y와 Z와 일치
<label> 디렉티브
- 설정 파일의 복잡성을 해결하기 위한 디렉티브.
- 새로운 Routing section을 정의함으로써 탑-다운 방식의 순서가 아닌, 참조의 형태를 가질 수 있게 한다.
<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>
'Backend' 카테고리의 다른 글
FastAPI로 Serving API 구축하기 (0) | 2023.05.27 |
---|---|
Locust 동작 방식 (1) | 2023.04.15 |
EFK 스택을 통한 Airflow 로그 모니터링 구축 (0) | 2023.03.17 |