0
0
Lập trình
Hưng Nguyễn Xuân 1
Hưng Nguyễn Xuân 1xuanhungptithcm

Hướng Dẫn Ghi Nhận Log với Loki, Python và Slack

Đăng vào 3 tuần trước

• 4 phút đọc

Chủ đề:

KungFuTech

Giới thiệu

Trong thời đại hiện nay, các ứng dụng hiện đại 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ì theo dõi log một cách thủ công, chúng ta cần một giải pháp giúp:

  1. Tập trung log ở một nơi
  2. Truy vấn log dễ dàng
  3. Nhận thông báo trên Slack khi có sự cố xảy ra

Để thực hiện điều này, tôi đã thiết lập Grafana Loki làm nơi lưu trữ log, tích hợp nó với Python và thêm thông báo Slack cho các lỗi sản xuất. Bài viết này sẽ hướng dẫn bạn từng bước thiết lập đầy đủ:

  • Cài đặt Loki
  • Cấu hình logging Python với Loki
  • Truy vấn Loki bằng Python
  • Gửi thông báo đến Slack khi xảy ra lỗi

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 tệp docker-compose.yml:

yaml Copy
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 Copy
docker-compose up -d

Giờ đây, Loki sẽ chạy tại:
👉 http://localhost:3100

Bước 2: Cấu Hình Promtail

Công việc của Promtail là gửi log vào Loki. Dưới đây là một ví dụ về tệp config.yml:

yaml Copy
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: Logging Python đến Loki

Bây giờ, chúng ta sẽ đẩy log từ ứng dụng Python vào Loki. Đầu tiên, bạn cần cài đặt bộ xử lý log cho Loki:

bash Copy
pip install logging-loki

Cập nhật ứng dụng Python của bạn (app.py):

python Copy
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 lỗi
try:
    1 / 0
except Exception as e:
    logger.error("🚨 Lỗi sản xuất xảy ra", exc_info=True)

Giờ đây, bất cứ khi nào ứng dụng của bạn gặp lỗi, nó sẽ được đẩy trực tiếp vào 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 một cách lập trình (ví dụ, kiểm tra thời gian phản hồi API hoặc lỗi).

python Copy
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 Slack cho Lỗi

Cuối cùng, chúng ta sẽ thông báo cho Slack khi có sự cố xảy ra.

Tạo Webhook trên Slack

  • Đi đến 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 Copy
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 thất bại: {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ự → Được kích hoạt như một thông báo Slack

Điều này mang đến cho tôi hai lớp giám sát:

  • Lịch sử log đầy đủ trong Loki (qua bảng điều khiển Grafana)
  • Thông báo thời gian thực trong Slack

✅ Kết Luận

Kết hợp Loki, Python và Slack, tôi đã có một hệ thống ghi nhận và cảnh báo tập trung:

  • Loki thu thập và lập chỉ mục tất cả log
  • Python đẩy 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

Cấu hình 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ỡ vấn đề sản xuất nào.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào