Tại sao mình từ bỏ ELK để sang Grafana Loki?
Quản lý hệ thống hàng chục container mà phải ssh vào từng máy gõ tail -f là một cực hình. Mình từng duy trì cụm Prometheus cho 15 server. Khi lỗi logic xảy ra, metrics báo CPU tăng vọt nhưng tuyệt nhiên không nói rõ dòng code nào đang “chết”. Đó là lúc mình hiểu: Metrics chỉ biết hệ thống đang “ốm”, còn Log mới chỉ ra được “bệnh” nằm ở đâu.
ELK Stack (Elasticsearch, Logstash, Kibana) thường là cái tên đầu tiên nảy ra trong đầu. Thế nhưng, ELK cực kỳ ngốn tài nguyên. Chạy một cụm Elasticsearch ổn định thường tốn ít nhất 8-16GB RAM—một con số quá xa xỉ với các startup nhỏ hoặc môi trường staging. Loki xuất hiện như một cứu cánh với triết lý “Prometheus cho logs”. Thay vì đánh chỉ mục (index) toàn bộ nội dung, Loki chỉ đánh nhãn (labels). Nhờ vậy, dung lượng lưu trữ có thể giảm tới 10 lần so với Elasticsearch.
Triển khai nhanh với Docker Compose
Để chạy bộ ba Loki – Promtail – Grafana, Docker Compose là lựa chọn gọn gàng nhất. Mô hình hoạt động rất đơn giản:
- Loki: Đóng vai trò là database lưu trữ và xử lý truy vấn.
- Promtail: Agent thu thập log từ file vật lý rồi đẩy về Loki.
- Grafana: Giao diện hiển thị, nơi bạn trực quan hóa các dòng log khô khan.
Tạo thư mục dự án và chuẩn bị file thực thi:
mkdir loki-stack && cd loki-stack
touch docker-compose.yaml promtail-config.yaml
Nội dung file docker-compose.yaml (sử dụng phiên bản Loki 3.0 mới nhất):
version: "3.8"
services:
loki:
image: grafana/loki:3.0.0
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
promtail:
image: grafana/promtail:3.0.0
volumes:
- /var/log:/var/log
- ./promtail-config.yaml:/etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
Cấu hình Promtail: Đừng để mất Log khi Restart
File cấu hình promtail-config.yaml dưới đây sẽ giúp agent biết cần “gom” log ở đâu. Lưu ý quan trọng về positions: nó giúp Promtail ghi nhớ dòng log cuối cùng đã đọc. Nếu container restart, nó sẽ không đẩy trùng log cũ vào Loki.
server:
http_listen_port: 9080
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
host: production-server-01
__path__: /var/log/*.log
Cảnh báo về High Cardinality
Sai lầm kinh điển của mình là đưa user_id hoặc client_ip vào label. Trong Loki, điều này tạo ra hàng triệu index nhỏ lẻ, khiến hệ thống treo cứng khi truy vấn. Kinh nghiệm thực tế: Chỉ đặt label cho thông tin tĩnh như env, app_name. Những dữ liệu biến động hãy để Loki tìm kiếm bằng LogQL sau.
Khai thác sức mạnh LogQL trên Grafana
Sau khi chạy docker-compose up -d, hãy truy cập localhost:3000. Thêm Loki làm Data Source với URL http://loki:3100. Tại menu Explore, bạn có thể bắt đầu “soi” log.
Cú pháp LogQL rất mạnh. Để lọc các dòng log chứa lỗi “Timeout” trong job hệ thống, bạn dùng:
{job="varlogs"} |= "Timeout"
Thú vị hơn, bạn có thể biến log thành biểu đồ ngay lập tức. Ví dụ: Đếm số lượng lỗi 404 mỗi phút từ log Nginx:
count_over_time({job="nginx"} |= "404" [1m])
Nhờ việc đặt biểu đồ log lỗi cạnh biểu đồ latency, mình từng phát hiện ra một bug tràn bộ nhớ đệm chỉ trong 2 phút, thay vì mất cả tiếng đồng hồ lục lọi file text như trước.
Kinh nghiệm vận hành thực tế
Để Loki chạy mượt mà trong môi trường production, bạn nên áp dụng 3 quy tắc sau:
- Giới hạn thời gian lưu trữ: Mặc định Loki giữ log mãi mãi. Hãy cấu hình
retention_period: 15dđể tránh đầy ổ cứng đột ngột. - Tận dụng Cloud Storage: Thay vì lưu log vào ổ cứng local (vốn đắt đỏ và dễ mất), hãy cấu hình Loki đẩy log sang S3 hoặc Google Cloud Storage. Chi phí sẽ rẻ hơn khoảng 5-7 lần.
- Pipeline Stages: Sử dụng Regex trong Promtail để bóc tách dữ liệu thô. Việc này giúp bạn lọc log theo Status Code hoặc Response Time cực nhanh ngay trên giao diện Grafana.
Thiết lập Loki ban đầu có thể hơi lạ lẫm với những ai quen dùng ELK. Tuy nhiên, khi đã làm chủ được LogQL, bạn sẽ thấy khả năng quan sát (Observability) của mình tăng vọt. Hệ thống minh bạch hơn, lỗi được tìm thấy nhanh hơn, và quan trọng nhất là bạn sẽ ngủ ngon hơn mỗi đêm.

