اجرای یک نمونه سورس با Docker و FastAPI برای لاگ‌گیری

  • مدرس : علی بیگدلی
  • تاریخ انتشار: 1404/06/26
  • تعداد بازدید: 1

در این مثال یک پروژه ساده FastAPI ایجاد می‌کنیم که لاگ‌ها را تولید می‌کند و از ELK Stack برای ذخیره و نمایش آن‌ها استفاده می‌کنیم.

ساختار پروژه

project/
├── app/
│   └── main.py
├── logs/
├── Dockerfile
└── docker-compose.yml

توضیح پوشه‌ها و فایل‌ها:

  • app/main.py: کد اصلی FastAPI و تولید لاگ‌ها.
  • logs/: پوشه محلی برای ذخیره لاگ‌های سرویس و اشتراک با کانتینر.
  • Dockerfile: تعریف محیط Docker برای اجرای FastAPI.
  • docker-compose.yml: راه‌اندازی سرویس FastAPI، Elasticsearch و Kibana به صورت همزمان.

main.py

from fastapi import FastAPI
import logging

app = FastAPI()

# تنظیم لاگر برای نوشتن لاگ‌ها در فایل
logging.basicConfig(
    filename="/var/log/service.log",
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s"
)

@app.get("/")
def root():
    logging.info("Root endpoint accessed")
    return {"message": "Hello, ELK Logging!"}

@app.get("/items/{item_id}")
def read_item(item_id: int):
    logging.info(f"Item endpoint accessed: {item_id}")
    return {"item_id": item_id}

Dockerfile

FROM python:3.11-slim

WORKDIR /app

COPY ./app /app

RUN pip install fastapi uvicorn

# ایجاد دایرکتوری لاگ
RUN mkdir -p /var/log

CMD ["fastapi", "dev", "--host", "0.0.0.0", "--port", "8000"]

docker-compose.yml

version: '3.8'
services:
  fastapi-app:
    build: .
    container_name: fastapi_app
    ports:
      - "8000:8000"
    volumes:
      - ./logs:/var/log
    networks:
      - elk

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
    ports:
      - "9200:9200"
    networks:
      - elk

  kibana:
    image: docker.elastic.co/kibana/kibana:8.12.0
    container_name: kibana
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
    ports:
      - "5601:5601"
    networks:
      - elk

networks:
  elk:
    driver: bridge

اجرای پروژه

docker-compose up -d --build

تست و مشاهده لاگ‌ها

  • دسترسی به API FastAPI: http://localhost:8000/docs
  • مشاهده لاگ‌ها در پوشه محلی ./logs/service.log
  • ارسال لاگ‌ها به Elasticsearch با استفاده از Logstash و مشاهده آن‌ها در Kibana

نحوه دسترسی سرویس‌ها به فایل لاگ

در این پروژه، سرویس FastAPI خودش فایل لاگ را در مسیر /var/log/service.log می‌نویسد. با استفاده از volume در Docker Compose، این مسیر به پوشه ./logs روی هاست نگاشت می‌شود، بنابراین:

  • FastAPI فایل لاگ را داخل کانتینر در /var/log/service.log می‌نویسد.
  • همزمان این فایل در هاست در ./logs/service.log موجود و قابل دسترسی است.
  • سرویس‌های دیگر مثل Logstash یا ELK می‌توانند همین فایل را بخوانند، پردازش کنند و به Elasticsearch ارسال نمایند.

مزایای این روش

  • همیشه فایل لاگ بین هاست و کانتینر همگام است.
  • لاگ‌ها حتی بعد از توقف یا حذف کانتینر حفظ می‌شوند.
  • چندین سرویس می‌توانند به صورت همزمان به فایل لاگ دسترسی داشته باشند.

با این ساختار، می‌توانید سرویس FastAPI را راه‌اندازی کرده، لاگ‌ها را تولید، ذخیره و به راحتی در ELK برای تحلیل و مانیتورینگ استفاده کنید.

ثبت دیدگاه


نکته: آدرس ایمیل شما منتشر نخواهد شد

دیدگاه کاربران (0)


هیچ دیدگاهی ثبت نشده است. می‌توانید اولین نفر باشید.