Cài đặt và cấu hình Fluent Bit trên Linux: Thu thập, lọc và chuyển tiếp log hiệu năng cao tới Loki và Elasticsearch

Monitoring tutorial - IT technology blog
Monitoring tutorial - IT technology blog

Quick start: Dựng Fluent Bit đẩy log sau 5 phút

Bỏ qua mớ lý thuyết dài dòng. Chúng ta bắt tay vào thực hành ngay để có một log collector chạy mượt trên máy.

1. Cài đặt Fluent Bit trên Ubuntu / Debian

Mở terminal và chạy script chính thức từ Fluent Bit để thêm kho lưu trữ cùng bản cài mới nhất:

curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh
sudo systemctl daemon-reload
sudo systemctl enable fluent-bit

Với RHEL, Rocky Linux hoặc AlmaLinux, bạn chạy lệnh tương đương:

curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh
sudo systemctl enable --now fluent-bit

2. Tạo file cấu hình tối thiểu đẩy metrics ra console

File cấu hình mặc định nằm ở /etc/fluent-bit/fluent-bit.conf. Tạo file cấu hình mẫu dưới đây để test nhanh pipeline:

sudo tee /etc/fluent-bit/fluent-bit.conf << 'EOF'
[SERVICE]
    Flush         1
    Log_Level     info
    Daemon        off

[INPUT]
    Name          cpu
    Tag           my_cpu
    Interval_Sec  2

[OUTPUT]
    Name          stdout
    Match         *
EOF

3. Chạy thử nghiệm trực tiếp

Gọi thẳng binary để quan sát dữ liệu in ra terminal:

/opt/fluent-bit/bin/fluent-bit -c /etc/fluent-bit/fluent-bit.conf

Dòng JSON chứa thông số CPU nhảy đều đặn mỗi 2 giây? Chúc mừng bạn, pipeline đã thông suốt.

Kiến trúc Fluent Bit: Nhẹ đến mức nào?

Nhiều bạn thắc mắc: “Sao không dùng Logstash hay Fluentd cho phổ biến?”. Điểm mấu chốt nằm ở chi phí tài nguyên. Logstash ngốn từ 500MB đến 1GB RAM vì chạy trên JVM. Fluentd viết bằng Ruby cũng chiếm tầm 50-100MB. Trong khi đó, Fluent Bit viết bằng C thuần. Nó chỉ ăn vỏn vẹn 15-30MB RAM và dưới 1% CPU khi xử lý hàng nghìn log/giây. Với VPS 1 vCPU – 1GB RAM hay cụm Kubernetes nghìn node, đây là khác biệt sống còn.

Pipeline xử lý log gồm 5 bước tuần tự:

  • INPUT: Đọc dữ liệu từ log file (tail), syslog, systemd journal hoặc metrics.
  • PARSER: Chuyển raw text (Nginx, Apache) thành JSON có cấu trúc.
  • FILTER: Thêm bớt trường, bóc tách IP, lọc bỏ dòng thừa hoặc gắn nhãn máy chủ.
  • BUFFER: Giữ tạm log trên RAM hoặc ghi xuống đĩa (filesystem buffer) phòng khi đích đến bị sập.
  • OUTPUT: Gửi log tới đích như Grafana Loki, Elasticsearch, OpenSearch hoặc Kafka.

Dữ liệu đi đúng đích nhờ cặp Tag và Match. Ở block INPUT, bạn gắn Tag web.nginx.access. Đến block OUTPUT, bạn chỉ định Match web.nginx.*. Fluent Bit sẽ tự động khớp tiền tố để điều hướng.

Cấu hình thực chiến: Đẩy song song về Loki và Elasticsearch

Mô hình phổ biến ở nhiều team là chia nhánh log. Loki dùng xem live tail và truy vấn nhanh trên Grafana dashboard. Elasticsearch giữ log để team Security hoặc Data đào sâu tìm kiếm full-text.

Thu thập Nginx access log và Syslog hệ thống

Đây là file /etc/fluent-bit/fluent-bit.conf chuẩn production cho cụm máy chủ Linux:

[SERVICE]
    Flush         1
    Log_Level     info
    Parsers_File  parsers.conf
    Storage.path  /var/log/fluent-bit/buffer
    Storage.sync  normal
    Storage.checksum off
    Storage.backlog.mem_limit 10M

# 1. INPUT: Đọc log Nginx
[INPUT]
    Name              tail
    Tag               web.nginx.access
    Path              /var/log/nginx/access.log
    Parser            nginx
    DB                /var/log/fluent-bit/nginx.db
    Mem_Buf_Limit     15MB
    Storage.type      filesystem

# 2. INPUT: Đọc Systemd Journal (Syslog)
[INPUT]
    Name              systemd
    Tag               host.systemd
    Read_From_Tail    On
    Storage.type      filesystem

# 3. FILTER: Gắn metadata máy chủ
[FILTER]
    Name              record_modifier
    Match             *
    Record env        production
    Record cluster    vps-sg-01

# 4. OUTPUT 1: Đẩy log về Grafana Loki
[OUTPUT]
    Name              loki
    Match             web.nginx.*
    Host              loki-server.internal
    Port              3100
    Labels            job=fluent-bit, app=nginx, env=$env
    Auto_Kubernetes_Labels off

# 5. OUTPUT 2: Đẩy log về Elasticsearch
[OUTPUT]
    Name              es
    Match             host.*
    Host              es-cluster.internal
    Port              9200
    Index             linux-systemd-logs
    Type              _doc
    HTTP_User         elastic
    HTTP_Passwd       SecretPassword123
    TLS               On
    TLS.verify        Off
    Retry_Limit       5

3 tham số không thể bỏ qua:

  • DB /var/log/fluent-bit/nginx.db: Fluent Bit lưu lại offset dòng log đã đọc vào file SQLite tí hon. Khi restart service hay reboot OS, tiến trình đọc tiếp vị trí cũ mà không sợ mất hoặc nhân đôi log.
  • Storage.type filesystem: Kích hoạt đệm trên ổ cứng. Nếu Elasticsearch mất kết nối 15 phút, log sẽ nằm an toàn trên đĩa thay vì phình to làm tràn RAM.
  • Retry_Limit 5: Khống chế số lần gửi lại khi network lỗi, tránh treo cứng worker thread.

Kinh nghiệm tối ưu từ môi trường Production

Hệ thống monitoring vận hành trơn tru hay không nằm ở khâu tinh chỉnh. Ban đầu, hễ backend Loki bảo trì 5 phút là hàng loạt server nhảy cảnh báo OOM vì buffer RAM cạn kiệt. Dưới đây là 3 bài học thực tế bạn nên áp dụng ngay:

1. Bắt buộc bật Disk Buffer thay vì chỉ dựa vào RAM

Mặc định Fluent Bit chỉ lưu tạm log trên RAM. Khi đích đến nghẽn mạng hoặc trả về HTTP 429/503, RAM chạm trần Mem_Buf_Limit. Hệ thống buộc phải drop log hoặc kích hoạt OOM Killer hạ gục luôn web server. Hãy luôn cấu hình Storage.type filesystem ở mọi block INPUT quan trọng.

2. Lọc bỏ log rác trước khi truyền qua mạng

Đừng gửi tất cả mọi thứ. Health check từ AWS ALB hay K8s liveness probe gõ /healthz mỗi 2 giây sẽ ngốn sạch quota lưu trữ. Dùng filter grep để gạt phăng chúng ngay tại nguồn:

[FILTER]
    Name    grep
    Match   web.nginx.access
    Exclude log ^.*"GET /healthz.*200.*$

Chỉ một rule đơn giản này có thể cắt giảm 40-60% dung lượng log vô nghĩa cần đẩy lên cluster mỗi ngày.

3. Kiểm tra cú pháp bằng dry-run trước khi reload

Đừng vội chạy systemctl restart fluent-bit ngay khi vừa sửa config. Hãy kiểm tra cú pháp trước bằng cờ -d (dry-run):

/opt/fluent-bit/bin/fluent-bit -c /etc/fluent-bit/fluent-bit.conf --dry-run

Khi thấy terminal báo configuration syntax ok, bạn mới yên tâm reload service:

sudo systemctl restart fluent-bit
sudo journalctl -u fluent-bit -f

Nắm vững pipeline và cơ chế disk buffer, bạn sẽ có một log shipper cực kỳ ổn định, bền bỉ và không lo tốn tài nguyên.

Share: