fastapi 기본로그에서 timestamp를 추가하기 위한 작업을 시작했습니다.
uvicorn 실행 시 --log-config 옵션을 사용하여 원하는 format으로 만들어 놓은 config를 사용할 수 있습니다.
uvicorn은 Python 언어로 작성된 ASGI(Application Server Gateway Interface) 서버로, 주로 웹 애플리케이션과 API를 빠르고 효율적으로 실행하기 위해 사용됩니다. ASGI 서버는 특히 비동기(Asynchronous) 프로그래밍에 적합하며, 높은 성능과 확장성을 요구하는 실시간 애플리케이션이나 웹소켓(WebSocket)을 지원하는 애플리케이션에 적합합니다.
주요 특징
- 고성능 및 비동기 지원:
- uvicorn은 비동기 I/O를 통해 높은 동시성 처리를 제공합니다. 이는 일반적으로 더 많은 요청을 처리하고 빠르게 응답할 수 있도록 돕습니다.
- uvicorn은 Python의 asyncio 및 uvloop을 이용하여 비동기적으로 동작합니다. uvloop을 사용할 경우 일반적인 이벤트 루프보다 성능이 더욱 향상됩니다.
- ASGI 및 웹소켓(WebSocket) 지원:
- uvicorn은 ASGI를 기반으로 설계되어 있어 Django, FastAPI, Starlette와 같은 ASGI 호환 프레임워크와 호환됩니다.
- 웹소켓을 통해 양방향 실시간 통신을 지원하여, 실시간 채팅, 게임, 알림 시스템 등에 적합합니다.
- 다양한 배포 환경에 적합:
- uvicorn은 Docker, Kubernetes 등의 환경에서 쉽게 배포할 수 있으며, 컨테이너화된 애플리케이션에서도 사용이 간편합니다.
- CLI(Command Line Interface)를 통해 간단하게 실행할 수 있고, --reload 옵션을 통해 코드 변경 시 자동으로 서버를 재시작할 수 있습니다.
- 쉽고 빠른 사용성:
- uvicorn은 단순한 명령으로 실행할 수 있으며, FastAPI와 같은 프레임워크와 함께 사용하기에 최적화되어 있습니다.
- 예를 들어 uvicorn main:app --reload와 같이 명령어 하나로 서버를 구동할 수 있습니다. 여기서 main:app은 main.py 파일에 있는 app 인스턴스를 실행하겠다는 의미입니다.
기본 사용법
pip install uvicorn # 설치
설치 후, 간단한 FastAPI 애플리케이션 예시를 실행하려면 다음과 같이 입력합니다:
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Hello": "World"}
uvicorn main:app --reload
--log-config는 uvicorn에서 서버 로깅을 커스터마이징할 수 있는 옵션으로, Python의 표준 로깅 설정 파일을 사용해 서버의 로깅 동작을 제어할 수 있게 해줍니다. 서버를 구동할 때 로깅 구성 파일을 지정하면 로깅 레벨, 출력 형식, 로그 파일 위치 등을 원하는 대로 설정할 수 있습니다.
이 옵션을 사용하면 로그 기록을 더욱 세밀하게 제어할 수 있어, 에러 발생 시 문제의 원인을 파악하거나 서버 활동을 추적하는 데 매우 유용합니다.
사용법
명령어에 --log-config 옵션을 추가하고, 구성 파일 경로를 지정하여 실행합니다.
uvicorn main:app --log-config ./path/to/log_config.yaml
로그 설정 파일 예시 (YAML)
다음은 log_config.yaml 파일의 예입니다. 이 설정을 통해 uvicorn 로그의 출력 형식과 레벨을 조정할 수 있습니다.
version: 1
formatters:
simple:
format: "[%(asctime)s] [%(levelname)s] %(message)s"
handlers:
console:
class: logging.StreamHandler
level: INFO
formatter: simple
stream: ext://sys.stdout
loggers:
simpleExample:
level: DEBUG
handlers: [console]
propagate: no
root:
level: DEBUG
handlers: [console]
세부 요소 설명
- version:
- 설정 파일의 버전을 지정하며, 현재 설정은 1 버전을 사용하고 있습니다.
- formatters:
- 로그 메시지의 출력 형식을 지정합니다.
- 이 설정에서 simple이라는 포매터가 정의되어 있으며, 형식은 다음과 같습니다:
- %(asctime)s: 로그가 발생한 시간을 표시합니다.
- %(levelname)s: 로그의 심각도 레벨(예: DEBUG, INFO, WARNING, ERROR)을 나타냅니다.
- %(message)s: 로그 메시지 자체가 표시됩니다.
- 최종 출력 형식 예시는 [2024-10-31 12:00:00] [INFO] 서버가 시작되었습니다와 같습니다.
- handlers:
- 로그가 어디로 출력될지 정의하는 부분입니다. 여기서는 console이라는 핸들러가 사용되고 있습니다.
- console 핸들러 설정:
- class: 로그를 콘솔에 출력하는 StreamHandler 클래스를 사용합니다.
- level: INFO 레벨 이상의 로그만 출력되도록 설정합니다.
- formatter: simple 포매터를 사용해 로그 형식을 지정합니다.
- stream: ext://sys.stdout를 통해 표준 출력 스트림으로 출력됩니다.
- loggers:
- 특정 로거를 정의하는 부분입니다. 여기서는 simpleExample라는 로거가 정의되어 있습니다.
- simpleExample 로거 설정:
- level: DEBUG 레벨 이상의 로그를 수집합니다.
- handlers: 로그 출력에 console 핸들러를 사용합니다.
- propagate: False로 설정하여, 상위 로거로 로그가 전파되지 않게 합니다.
- root:
- 기본 로거의 설정입니다. 별도의 로거가 정의되지 않은 경우 이 루트 로거가 적용됩니다.
- root 설정:
- level: 기본 로깅 레벨을 DEBUG로 설정하여 모든 레벨의 로그를 기록합니다.
- handlers: console 핸들러를 사용해 모든 로그를 콘솔에 출력합니다.
요약
이 로깅 설정 파일은 모든 로그를 콘솔에 출력하도록 구성되었으며, 기본적으로 DEBUG 레벨부터 모든 로그를 기록하도록 설정되어 있습니다. simpleExample 로거는 DEBUG 레벨 이상을 수집하며, root는 모든 로거가 이 설정을 따르도록 구성됩니다.
--log-config 옵션을 통해 로깅 설정을 세밀하게 조정하면, 시스템 상태 파악과 디버깅에 매우 유용하게 활용할 수 있습니다.
'python' 카테고리의 다른 글
pip으로 Poetry 설치하고 설정하는 가이드 (3) | 2024.11.20 |
---|---|
use-implicit-booleaness-not-comparison: Pythonic 코드 작성법 (0) | 2024.11.12 |
파이썬 파일 경로 처리: splitext로 파일명과 확장자 쉽게 분리하기 (0) | 2024.09.10 |
Pydantic v2 Validator: 필드와 모델 유효성 검사 (1) | 2024.09.05 |
파이썬에서 문자열이 공백인지 쉽게 확인하는 3가지 방법 (0) | 2024.08.27 |