[python] FastAPI에서 로그 수집 및 분석 구현하기

FastAPI는 빠르고 간편하게 웹 애플리케이션을 개발할 수 있는 Python 웹 프레임워크입니다. 이번 포스트에서는 FastAPI 애플리케이션에서 로그를 수집하고 분석하는 방법에 대해서 알아보겠습니다.

로깅 설정

먼저, FastAPI 애플리케이션의 로깅 설정을 변경해야 합니다. 로깅은 logging 모듈을 사용하여 구현할 수 있습니다. 가장 먼저, logging 모듈을 임포트해야 합니다.

import logging

기본적으로 FastAPI는 uvicorn 라이브러리를 사용하여 서버를 실행합니다. 따라서 uvicorn의 로거 설정을 변경해야 합니다. 로거를 가져오기 위해 다음 코드를 추가합니다.

logger = logging.getLogger("uvicorn")

로그 수준을 설정하고자 하는 경우, 다음과 같이 로깅 수준을 정의할 수 있습니다. 예를 들어, DEBUG 수준을 설정하려면 다음과 같이 작성합니다.

logger.setLevel(logging.DEBUG)

로그를 출력할 핸들러를 추가하려는 경우, 다음과 같이 핸들러를 정의하고 로거에 추가할 수 있습니다.

handler = logging.StreamHandler()
logger.addHandler(handler)

로그 수집

이제 로깅 설정이 완료되었으므로, 로그를 수집할 수 있습니다. FastAPI 애플리케이션에서의 각 요청과 응답은 미들웨어를 통해 처리됩니다. 따라서 미들웨어를 사용하여 요청과 응답을 로그로 수집할 수 있습니다.

from fastapi import FastAPI
from starlette.requests import Request
from starlette.responses import Response

app = FastAPI()

@app.middleware("http")
async def log_requests(request: Request, call_next):
    logger.info(f"Received request: {request.method} {request.url}")
    response = await call_next(request)
    logger.info(f"Responded with status code: {response.status_code}")
    return response

위의 예제는 미들웨어 함수를 정의하고, 각 요청과 응답에 대해서 로그를 출력하고 있습니다. 요청에 대한 정보는 request.methodrequest.url을 사용하여 가져올 수 있습니다. 응답에 대한 정보는 response.status_code를 사용하여 가져올 수 있습니다.

로그 분석

로그를 수집한 후에는 이를 분석하여 유용한 정보를 추출할 수 있습니다. 예를 들어, 응답의 처리 시간을 분석하기 위해 다음과 같은 코드를 작성할 수 있습니다.

import time

@app.middleware("http")
async def measure_response_time(request: Request, call_next):
    start_time = time.time()
    response = await call_next(request)
    end_time = time.time()
    processing_time = end_time - start_time
    logger.info(f"Processed request in {processing_time} seconds")
    return response

위의 예제에서는 요청을 처리하기 시작한 시간과 완료한 시간을 측정하여 처리 시간을 계산하고 로그로 출력하고 있습니다.

결론

이번 포스트에서는 FastAPI 애플리케이션에서 로그를 수집하고 분석하는 방법에 대해 알아보았습니다. 로깅 설정을 변경하고, 미들웨어를 사용하여 요청과 응답을 로그로 수집할 수 있으며, 수집한 로그를 분석하여 유용한 정보를 추출할 수 있습니다. 이러한 로깅 및 분석 기능을 활용하여 FastAPI 애플리케이션의 성능 및 이슈를 파악할 수 있습니다.

참고 자료