FastAPI와 PostgreSQL을 함께 사용하여 효율적인 로깅 시스템을 구축하는 방법을 소개합니다. 이 글에서는 Docker Compose를 사용하여 FastAPI 애플리케이션과 PostgreSQL 데이터베이스를 쉽게 연결하고 관리하는 방법을 탐구합니다.
이전화에서 다뤘던 간단한 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
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.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 패키지들을 나열합니다.