2024. 9. 2. 14:51ㆍit
FastAPI 애플리케이션을 운영하면서 로그 관리의 중요성은 아무리 강조해도 부족하지 않습니다. 이 포스트에서는 TimedRotatingFileHandler를 사용하여 로그를 날짜별로 자동으로 롤링하는 방법과 Docker에서 로그 파일을 외부로 마운트하는 설정에 대해 설명하겠습니다.
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
'it' 카테고리의 다른 글
jupyter 노트북 python 버전 추가 (0) | 2024.10.29 |
---|---|
Top-P와 Top-K 샘플링을 통한 AI 언어 모델의 응답 제어: 쉽게 이해하기 (0) | 2024.05.29 |
MongoDB 8.0 업데이트: 기능 소개 및 성능 개선 (0) | 2024.05.29 |
쿠버네티스 Ingress 예제 그대로 따라하기 (0) | 2024.04.26 |
윈도우에서 mibikube 설치 방법 ( feat.WSL ) (0) | 2024.04.22 |