[python] Flask-RESTful에서 데이터베이스 액세스 로그 기록 방법

Flask-RESTful은 데이터베이스와의 상호 작용을 통해 API를 개발하는 데 매우 유용한 프레임워크입니다. 애플리케이션에서 데이터베이스 액세스 로그를 기록하는 것은 중요한 디버깅 및 모니터링 도구입니다. 이번 블로그 포스트에서는 Flask-RESTful에서 데이터베이스 액세스 로그를 기록하는 방법을 알아보겠습니다.

1. Flask 애플리케이션 설정

먼저, Flask 애플리케이션을 설정해야 합니다. Flask 애플리케이션에서는 데이터베이스 로깅을 위한 로깅 설정을 추가해야 합니다. 웹 애플리케이션의 app.py 파일에서 아래 코드 스니펫을 추가합니다.

import logging
from logging.handlers import RotatingFileHandler

app = Flask(__name__)

# 데이터베이스 로깅을 위한 로거 생성
db_logger = logging.getLogger('db')
db_logger.setLevel(logging.INFO)

# 로그 파일 생성 및 핸들러 추가
db_handler = RotatingFileHandler('db.log', maxBytes=1024 * 1024 * 10, backupCount=5)
db_handler.setLevel(logging.INFO)

# 로그 형식 설정
formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s')
db_handler.setFormatter(formatter)

# 핸들러를 로거에 추가
db_logger.addHandler(db_handler)

위 코드에서는 db_logger라는 로거를 생성하고 db.log라는 로그 파일에 데이터베이스 로깅을 기록합니다.

2. 데이터베이스 액세스 로그 기록

Flask-RESTful에서 데이터베이스 액세스 로그를 기록하기 위해 SQLAlchemy의 이벤트 라이프사이클을 사용할 수 있습니다. 이를 이용하여 데이터베이스 조회, 추가, 수정 및 삭제와 같은 작업이 수행될 때 로그를 작성합니다.

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import event

db = SQLAlchemy(app)

@event.listens_for(db.session, 'before_commit')
def log_database_activity(session):
    for statement in session.flush().all():
        db_logger.info(f"Database activity: {statement}")

# 예시 모델
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))

# 예시 리소스
class UserResource(Resource):
    def get(self, user_id):
        user = User.query.get(user_id)
        db_logger.info(f"User {user.name} 조회")

    def post(self):
        user = User(name="John Doe")
        db.session.add(user)
        db.session.commit()
        db_logger.info("새로운 사용자 추가")

api.add_resource(UserResource, '/users', '/users/<int:user_id>')

위 코드에서는 SQLAlchemy의 before_commit 이벤트를 통해 데이터베이스 작업 전에 로그를 작성하는 함수인 log_database_activity를 정의합니다. 이 함수는 db_logger를 사용하여 데이터베이스 작업을 로깅합니다.

또한, 간단한 User 모델과 UserResource 리소스를 생성하여 예시를 제공합니다. 이러한 예시는 RESTful API의 일부분일 수 있으며, 데이터베이스 액세스 시 로깅이 진행됩니다.

3. 로그 확인

Flask-RESTful 애플리케이션을 실행한 후, db.log 파일을 확인하여 데이터베이스 액세스 로그를 확인할 수 있습니다. 로그 파일은 INFO 레벨의 로그를 기록하므로, 필요에 따라 로깅 수준을 조정할 수 있습니다.

마무리

이번 블로그 포스트에서는 Flask-RESTful에서 데이터베이스 액세스 로그를 기록하는 방법을 알아보았습니다. 데이터베이스 로깅은 개발 중인 애플리케이션의 디버깅 및 모니터링에 매우 유용합니다. Flask-RESTful과 SQLAlchemy를 함께 사용하여 간단하게 데이터베이스 액세스 로그를 기록할 수 있습니다.

더 많은 Flask-RESTful 기능 및 SQLAlchemy의 이벤트 라이프사이클에 대한 자세한 정보는 공식 문서를 참조하시기 바랍니다: