در این مثال یک پروژه ساده 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 برای تحلیل و مانیتورینگ استفاده کنید.