0
0
Lập trình
TT

Hướng Dẫn Ghi Log Với Loki, Python Và Tích Hợp Slack

Đăng vào 1 tháng trước

• 4 phút đọc

Chủ đề:

KungFuTech

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ả để:

  1. Tập hợp log tại một nơi duy nhất.
  2. Truy vấn log một cách dễ dàng.
  3. 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

Đầ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 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

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 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: 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 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 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 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 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

  1. Truy cập Slack → Ứng dụng → Tạo Ứng Dụng → Incoming Webhooks
  2. 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 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.

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