Hướng Dẫn Ghi Log Với Loki, Python Và Tích Hợp Slack
Giới Thiệu
Trong thời đại công nghệ hiện đại, các ứng dụng thường xuyên tạo ra một lượng lớn log, từ thời gian phản hồi API đến các lỗi nghiêm trọng. Thay vì phải theo dõi log một cách thủ công, chúng ta cần một giải pháp hiệu quả để:
- Tập hợp log tại một nơi duy nhất.
- Truy vấn log một cách dễ dàng.
- Nhận thông báo qua Slack khi có sự cố xảy ra.
Trong bài viết này, tôi sẽ hướng dẫn bạn cách thiết lập Grafana Loki làm kho lưu trữ log, tích hợp với Python và thêm các thông báo lỗi vào Slack.
Mục Lục
- Bước 1: Cài Đặt Loki
- Bước 2: Cấu Hình Promtail
- Bước 3: Ghi Log Python Đến Loki
- Bước 4: Truy Vấn Loki Bằng Python
- Bước 5: Thông Báo Lỗi Qua Slack
- Kết Luận
Bước 1: Cài Đặt Loki
Đầu tiên, bạn cần cài đặt Loki và Promtail (Promtail sẽ thu thập log và gửi chúng đến Loki).
Sử Dụng Docker Compose
Tạo một file docker-compose.yml như sau:
yaml
version: "3"
services:
loki:
image: grafana/loki:latest
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
promtail:
image: grafana/promtail:latest
volumes:
- /var/log:/var/log
command: -config.file=/etc/promtail/config.yml
Khởi động Loki:
bash
docker-compose up -d
Bây giờ, bạn có thể truy cập Loki tại:
👉 http://localhost:3100
Bước 2: Cấu Hình Promtail
Nhiệm vụ của Promtail là gửi log của bạn vào Loki.
Ví dụ về file config.yml:
yaml
server:
http_listen_port: 9080
grpc_listen_port: 0
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
__path__: /var/log/*.log
Cấu hình này sẽ gửi log từ /var/log/*.log vào Loki.
Bước 3: Ghi Log Python Đến Loki
Bây giờ, hãy để ứng dụng Python của bạn ghi log vào Loki.
Cài đặt trình xử lý log của Loki:
bash
pip install logging-loki
Cập nhật ứng dụng Python của bạn (app.py):
python
import logging
from logging_loki import LokiHandler
# URL của Loki (điều chỉnh theo cấu hình của bạn)
LOKI_URL = "http://localhost:3100/loki/api/v1/push"
# Cấu hình logger
logger = logging.getLogger("python-app")
logger.setLevel(logging.ERROR)
handler = LokiHandler(
url=LOKI_URL,
tags={"application": "my-python-app"},
version="1",
)
logger.addHandler(handler)
# Ví dụ: mô phỏng một lỗi
try:
1 / 0
except Exception as e:
logger.error("🚨 Lỗi sản xuất đã xảy ra", exc_info=True)
Bây giờ, mỗi khi ứng dụng của bạn gặp lỗi, nó sẽ được gửi trực tiếp đến Loki với metadata có cấu trúc.
Bước 4: Truy Vấn Loki Bằng Python
Đôi khi, bạn có thể muốn truy vấn Loki theo cách lập trình (ví dụ: kiểm tra thời gian phản hồi API hoặc lỗi).
python
import requests
LOKI_QUERY_URL = "http://localhost:3100/loki/api/v1/query"
query = '{application="my-python-app"} |= "error"'
response = requests.get(LOKI_QUERY_URL, params={"query": query})
if response.status_code == 200:
results = response.json()["data"]["result"]
for log in results:
print(log)
Điều này cho phép bạn lấy log lỗi trực tiếp trong Python.
Bước 5: Thông Báo Lỗi Qua Slack
Cuối cùng, hãy thông báo qua Slack khi có sự cố xảy ra.
Tạo Webhook cho Slack
- Truy cập Slack → Ứng dụng → Tạo Ứng Dụng → Incoming Webhooks
- Sao chép URL Webhook
Mã Python Gửi Thông Báo
python
import requests
import json
import logging
from logging_loki import LokiHandler
# URL webhook Slack
SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/XXX/YYY/ZZZ"
def send_slack_alert(message: str):
payload = {"text": message}
headers = {"Content-Type": "application/json"}
res = requests.post(SLACK_WEBHOOK_URL, data=json.dumps(payload), headers=headers)
if res.status_code != 200:
print(f"Thông báo Slack không thành công: {res.text}")
# Logger Loki
LOKI_URL = "http://localhost:3100/loki/api/v1/push"
logger = logging.getLogger("python-app")
logger.setLevel(logging.ERROR)
logger.addHandler(LokiHandler(url=LOKI_URL, tags={"app": "python-app"}, version="1"))
# Ví dụ: mô phỏng lỗi sản xuất
try:
result = 1 / 0
except Exception as e:
error_message = f"🚨 Lỗi trong sản xuất: {str(e)}"
logger.error(error_message, exc_info=True) # gửi đến Loki
send_slack_alert(error_message) # gửi đến Slack
Quy Trình Cuối Cùng
- Ứng dụng Python chạy trong môi trường sản xuất.
- Mọi lỗi → Được ghi lại vào Loki.
- Lỗi tương tự → Gửi thông báo qua Slack.
Điều này mang lại cho tôi hai lớp giám sát:
- Lịch sử log đầy đủ trong Loki (thông qua bảng điều khiển Grafana).
- Thông báo tức thì trong Slack.
Kết Luận
Bằng cách kết hợp Loki, Python và Slack, tôi đã xây dựng được một hệ thống ghi log và thông báo tập trung:
- Loki thu thập và lập chỉ mục tất cả các log.
- Python gửi lỗi có cấu trúc trực tiếp.
- Slack ngay lập tức thông báo cho nhóm khi có sự cố xảy ra.
Thiết lập này đã giúp tôi tiết kiệm thời gian gỡ lỗi và đảm bảo rằng tôi không bao giờ bỏ lỡ một vấn đề sản xuất nào.