한 호스트에서 성격이 다른 로그 파일 여러 개를 모아, 로컬 파일에도 남기면서 동시에 상위 Fluentd 로 넘기는 구성이다. Fluent Bit 는 가볍게 수집만 하고 가공·분기는 Fluentd 가 맡는 흔한 2계층 형태다.
YAML 형식에서는 입력·필터·출력이 모두 pipeline: 아래에 들어간다. 최상위에 inputs: 를 바로 두는 예제가 돌아다니지만 현행 스키마가 아니다.
/etc/fluent-bit/fluent-bit.yaml
service:
flush: 1
log_level: info
parsers_file: /etc/fluent-bit/parsers.conf
storage.path: /var/lib/fluent-bit/storage
storage.sync: normal
pipeline:
inputs:
- name: tail
tag: host.messages
path: /var/log/messages
db: /var/lib/fluent-bit/messages.db
refresh_interval: 5
skip_long_lines: on
- name: tail
tag: app.application1
path: /var/log/application1/application.log
db: /var/lib/fluent-bit/app1.db
multiline.parser: java
- name: tail
tag: app.nifi
path: /var/log/nifi/nifi-app.log
db: /var/lib/fluent-bit/nifi.db
multiline.parser: java
filters:
- name: modify
match: '*'
add: collector fluent-bit
outputs:
- name: file
match: '*'
path: /var/log/fluent-log
file: fluent-log.log
format: plain
- name: forward
match: '*'
host: fluentd.example.internal
port: 24224
retry_limit: false
db 를 지정하면 어디까지 읽었는지 SQLite 파일에 저장한다. 없으면 Fluent Bit 을 재시작할 때마다 로그가 중복되거나 유실되므로 tail 입력에는 반드시 넣는다.
tag 는 출력·필터에서 대상을 고르는 유일한 수단이다. 위처럼 계층형으로 지어 두면 나중에 match: app.* 로 한 묶음만 다룰 수 있다.
Java 스택트레이스처럼 여러 줄이 한 사건인 로그는 multiline.parser 를 지정해야 줄마다 쪼개지지 않는다. 내장 파서로 java · python · go · docker · cri 가 있다.
retry_limit: false 는 전송 실패 시 무한 재시도한다는 뜻이다. Fluentd 가 잠깐 죽어도 버리지 않으려면 이 값과 함께 파일 기반 버퍼(storage.path)를 켜 둔다.
/etc/fluent-bit/parsers.conf 는 classic 형식으로 쓴다.
[PARSER]
Name nifi
Format regex
Regex ^(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3}) (?<level>[A-Z]+) \[(?<thread>[^\]]+)\] (?<message>.*)$
Time_Key time
Time_Format %Y-%m-%d %H:%M:%S,%L
밀리초는 %L 로 받는다. %S 까지만 쓰면 ,234 부분에서 파싱이 실패해 이벤트가 통째로 버려진다.
설정을 고친 뒤에는 기동 전에 문법을 본다.
/opt/fluent-bit/bin/fluent-bit -c /etc/fluent-bit/fluent-bit.yaml --dry-run
systemctl restart fluent-bit
journalctl -u fluent-bit -f
내부 지표는 HTTP 로 확인한다. service 에 http_server: true · http_port: 2020 을 두면 열린다.
curl -s localhost:2020/api/v1/metrics | python3 -m json.tool
output.*.retries_failed 가 계속 오르면 Fluentd 쪽 24224 포트가 막혔거나 프로토콜이 맞지 않는 것이다.
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<match app.**>
@type file
path /var/log/fluentd/app
<buffer>
@type file
path /var/log/fluentd/buffer/app
timekey 1h
flush_at_shutdown true
</buffer>
<format>
@type json
</format>
</match>
수집 대상이 늘어 Kafka 입력이나 Loki · S3 출력이 필요해지면 플러그인을 따로 설치한다.