4. 도커(Docker)와 함께하는 FastAPI CRUD 구축: FastAPI 로깅 시스템 구축

data_jeong·2023년 11월 13일
0
post-thumbnail

FastAPI와 PostgreSQL을 함께 사용하여 효율적인 로깅 시스템을 구축하는 방법을 소개합니다. 이 글에서는 Docker Compose를 사용하여 FastAPI 애플리케이션과 PostgreSQL 데이터베이스를 쉽게 연결하고 관리하는 방법을 탐구합니다.

FastAPI 애플리케이션 설정

이전화에서 다뤘던 간단한 CRUD 로직을 가진 main.py와 Pydantic 모델을 정의한 models.py를 사용하여 애플리케이션을 구성합니다.

main.py - FastAPI 애플리케이션

pythonCopy code
from fastapi import FastAPI, HTTPException
import logging
from database_logger import DatabaseLogHandler
from models import Item

app = FastAPI()

# 로깅 설정
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# 데이터베이스 로깅 핸들러 설정
db_config = {
    "dbname": "your_dbname",
    "user": "your_username",
    "password": "your_password",
    "host": "your_host"
}
logger.addHandler(DatabaseLogHandler(db_config))

# 간단한 데이터 저장소
items = {}

@app.post("/items/{item_id}", response_model=Item)
def create_item(item_id: int, item: Item):
    if item_id in items:
        raise HTTPException(status_code=400, detail="Item already exists")
    items[item_id] = item.dict()
    logger.info(f"Item created: {item_id} = {item}")
    return items[item_id]

@app.get("/items/{item_id}", response_model=Item)
def read_item(item_id: int):
    if item_id not in items:
        raise HTTPException(status_code=404, detail="Item not found")
    return items[item_id]

@app.put("/items/{item_id}", response_model=Item)
def update_item(item_id: int, item: Item):
    if item_id not in items:
        raise HTTPException(status_code=404, detail="Item not found")
    items[item_id] = item.dict()
    logger.info(f"Item updated: {item_id} = {item}")
    return items[item_id]

@app.delete("/items/{item_id}")
def delete_item(item_id: int):
    if item_id not in items:
        raise HTTPException(status_code=404, detail="Item not found")
    del items[item_id]
    logger.info(f"Item deleted: {item_id}")
    return {"detail": "Item deleted"}

models.py

pythonCopy code
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    in_stock: bool = True

로그를 PostgreSQL에 저장

DatabaseLogHandler를 사용하여 FastAPI 애플리케이션에서 발생하는 로그를 PostgreSQL 데이터베이스에 저장합니다.

database_logger.py - 데이터베이스 로깅 설정

import logging
import psycopg2

class DatabaseLogHandler(logging.Handler):
    def __init__(self, db_config):
        super().__init__()
        self.db_config = db_config

    def emit(self, record):
        try:
            connection = psycopg2.connect(**self.db_config)
            cursor = connection.cursor()
            log_entry = self.format(record)
            cursor.execute("INSERT INTO application_logs (log_level, log_message) VALUES (%s, %s)",
                           (record.levelname, log_entry))
            connection.commit()
            cursor.close()
            connection.close()
        except Exception as e:
            print(f"Logging error: {e}")

# 사용 예시
# db_config는 main.py에서 정의됩니다.

Docker Compose 설정

docker-compose.yml 파일을 사용하여 FastAPI 애플리케이션과 PostgreSQL 데이터베이스를 함께 구성합니다.

docker-compose.yml

version: '3.8'
services:
  fastapi-app:
    build: .
    ports:
      - "80:80"
    depends_on:
      - postgres
    environment:
      DB_NAME: your_dbname
      DB_USER: your_username
      DB_PASSWORD: your_password
      DB_HOST: postgres
		restart: unless-stopped

  postgres:
    image: postgres
		restart: unless-stopped
    environment:
      POSTGRES_USER: your_username
      POSTGRES_PASSWORD: your_password
      POSTGRES_DB: your_dbname
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  postgres-data:

실행 및 테스트

Docker Compose를 사용하여 서비스를 실행하고 테스트하는 방법을 설명합니다.

docker-compose up -d

결론

FastAPI와 PostgreSQL을 사용한 로깅 시스템은 애플리케이션의 성능을 모니터링하고 문제를 신속하게 해결하는 데 필수적입니다. Docker Compose를 사용하면 서비스의 구성과 관리가 훨씬 쉬워지며, 개발 및 배포 과정을 더욱 효율적으로 만들 수 있습니다. 이러한 접근 방식을 통해 개발자들은 FastAPI 애플리케이션의 로깅 시스템을 강화하고, 데이터베이스 관리를 간소화할 수 있습니다.

최종 프로젝트 구조

project_root/
│
├── app/                   # 애플리케이션 코드 폴더
│   ├── main.py            # FastAPI 메인 애플리케이션 파일
│   └── models.py          # Pydantic 모델 정의 파일
│
├── database/              # 데이터베이스 관련 코드 폴더
│   └── database_logger.py # 데이터베이스 로깅 설정 파일
│
├── docker-compose.yml     # Docker Compose 구성 파일
│
├── Dockerfile             # Docker 이미지 빌드를 위한 파일
│
└── requirements.txt       # 필요한 Python 패키지 목록

이 구조에서:

  • project_root/는 프로젝트의 루트 디렉토리입니다.
  • app/ 폴더는 FastAPI 애플리케이션의 코드를 포함합니다.
  • database/ 폴더는 데이터베이스 로깅과 관련된 코드를 포함합니다.
  • docker-compose.yml 파일은 Docker Compose를 이용한 서비스 설정을 정의합니다.
  • Dockerfile은 FastAPI 애플리케이션을 위한 Docker 이미지를 빌드하기 위한 설정을 포함합니다.
  • requirements.txt 파일은 프로젝트 실행에 필요한 Python 패키지들을 나열합니다.
profile
데이터를 주력으로 하는 잡부입니다!

0개의 댓글