FastAPI의 로그 TTL 설정과 Docker 파일 마운트 설정

2024. 9. 2. 14:51it

반응형

FastAPI 애플리케이션을 운영하면서 로그 관리의 중요성은 아무리 강조해도 부족하지 않습니다. 이 포스트에서는 TimedRotatingFileHandler를 사용하여 로그를 날짜별로 자동으로 롤링하는 방법과 Docker에서 로그 파일을 외부로 마운트하는 설정에 대해 설명하겠습니다.

 

728x90

 

0. 파일 구조 

my_fastapi_project/
│
├── Dockerfile
├── requirements.txt
├── logging.conf
│
└── src/
    ├── app.py
    └── get_data.py

 

1. 로그 설정 파일 (logging.conf)

우선, 로그 설정 파일을 만들어 TimedRotatingFileHandler를 사용하여 로그를 관리할 수 있습니다. 아래는 logging.conf 파일의 예제입니다.

[loggers]
keys=root

[handlers]
keys=infoHandler,errorHandler

[formatters]
keys=default

[logger_root]
level=DEBUG
handlers=infoHandler,errorHandler

[handler_infoHandler]
class=handlers.TimedRotatingFileHandler
level=INFO
formatter=default
args=('/app/logs/info/info.log', 'midnight', 1, 10)

[handler_errorHandler]
class=handlers.TimedRotatingFileHandler
level=ERROR
formatter=default
args=('/app/logs/error/error.log', 'midnight', 1, 10)

[formatter_default]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S

 

TimedRotatingFileHandler: 이 핸들러는 로그 파일을 주기적으로 롤링합니다. 여기서는 자정(midnight)에 롤링하며, 최대 10개의 백업 파일을 유지합니다.
infoHandler: INFO 레벨 이상의 로그를 /app/logs/info/info.log에 기록합니다.
errorHandler: ERROR 레벨 이상의 로그를 /app/logs/error/error.log에 기록합니다.

 

반응형

 

2. FastAPI 애플리케이션 코드

FastAPI 애플리케이션에서 로그를 기록하려면, 애플리케이션 코드에서 로깅 설정을 로드하고, 로거를 사용하여 로그를 기록하면 됩니다. 다음은 FastAPI 애플리케이션의 예제 코드입니다.

 

import logging.config
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
import uvicorn
import asyncio
import json

# 로그 설정 파일 로드
logging.config.fileConfig('/app/logging.conf')

# FastAPI 앱 생성
app = FastAPI()

async def process_message(message):
    # 메시지를 처리하여 응답을 스트리밍하는 함수
    pass

@app.get('/')
async def index():
    return "HI? HELLO?"

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    try:
        while True:
            message = await websocket.receive_text()
            # 메시지를 처리하고 응답 전송
            await websocket.send_text("Processed message")
            await websocket.send_text("END_OF_MESSAGE")
    except WebSocketDisconnect:
        logging.info("Client disconnected")
    except Exception as e:
        logging.error(f"Error: {e}")
        await websocket.close(code=1000)

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8506)

 


logging.config.fileConfig: 설정 파일을 로드하여 로거를 설정합니다.
로그 메시지 기록: logging.info()logging.error()를 사용하여 로그를 기록합니다.

 

3. Docker 설정

Docker에서 로그 파일을 외부로 마운트하려면, Dockerfile에서 로그 디렉토리를 생성하고, docker run 명령어에서 볼륨을 마운트해야 합니다.

# 베이스 이미지
FROM python:3.9-slim

# 작업 디렉토리 설정
WORKDIR /app

# 프로젝트 파일 복사
COPY ./src /app
COPY requirements.txt .
COPY logging.conf /app/logging.conf

# 로그 디렉토리 생성
RUN mkdir -p /app/logs/info /app/logs/error

# 필요 패키지 설치
RUN pip install --no-cache-dir -r requirements.txt

# 애플리케이션 실행
CMD ["uvicorn", "app:app", "--log-config", "/app/logging.conf", "--host", "0.0.0.0", "--port", "8506"]

 

 

4. Docker Run 명령어

Docker 컨테이너에서 로그 파일을 호스트 시스템으로 마운트하려면, docker run 명령어를 사용하여 볼륨을 마운트합니다.

 

 

4-1 Docker Build

docker build -t your_image_name .

 

4-2 Docker run 

docker run -d --name your_image_name -v /path/on/host/logs:/app/logs your_image_name

 

 

 

반응형