본문 바로가기
python

Fastapi 애플리케이션 로깅 : YAML 설정으로 로깅 구성하는 법(timestamp 추가)

by 니나노뭉 2024. 10. 31.

fastapi 기본로그에서 timestamp를 추가하기 위한 작업을 시작했습니다.

uvicorn 실행 시 --log-config 옵션을 사용하여 원하는 format으로 만들어 놓은 config를 사용할 수 있습니다.


uvicorn은 Python 언어로 작성된 ASGI(Application Server Gateway Interface) 서버로, 주로 웹 애플리케이션과 API를 빠르고 효율적으로 실행하기 위해 사용됩니다. ASGI 서버는 특히 비동기(Asynchronous) 프로그래밍에 적합하며, 높은 성능과 확장성을 요구하는 실시간 애플리케이션이나 웹소켓(WebSocket)을 지원하는 애플리케이션에 적합합니다.

주요 특징

  1. 고성능 및 비동기 지원:
    • uvicorn은 비동기 I/O를 통해 높은 동시성 처리를 제공합니다. 이는 일반적으로 더 많은 요청을 처리하고 빠르게 응답할 수 있도록 돕습니다.
    • uvicorn은 Python의 asyncio 및 uvloop을 이용하여 비동기적으로 동작합니다. uvloop을 사용할 경우 일반적인 이벤트 루프보다 성능이 더욱 향상됩니다.
  2. ASGI 및 웹소켓(WebSocket) 지원:
    • uvicorn은 ASGI를 기반으로 설계되어 있어 Django, FastAPI, Starlette와 같은 ASGI 호환 프레임워크와 호환됩니다.
    • 웹소켓을 통해 양방향 실시간 통신을 지원하여, 실시간 채팅, 게임, 알림 시스템 등에 적합합니다.
  3. 다양한 배포 환경에 적합:
    • uvicorn은 Docker, Kubernetes 등의 환경에서 쉽게 배포할 수 있으며, 컨테이너화된 애플리케이션에서도 사용이 간편합니다.
    • CLI(Command Line Interface)를 통해 간단하게 실행할 수 있고, --reload 옵션을 통해 코드 변경 시 자동으로 서버를 재시작할 수 있습니다.
  4. 쉽고 빠른 사용성:
    • 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
 
uvicorn은 특히 FastAPI와 Starlette와 함께 사용할 때 최고의 성능을 발휘하므로, 비동기 애플리케이션에 최적화된 서버 환경을 구축하고자 할 때 훌륭한 선택지입니다.
 

--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]

세부 요소 설명

  1. version:
    • 설정 파일의 버전을 지정하며, 현재 설정은 1 버전을 사용하고 있습니다.
  2. formatters:
    • 로그 메시지의 출력 형식을 지정합니다.
    • 이 설정에서 simple이라는 포매터가 정의되어 있으며, 형식은 다음과 같습니다:
      • %(asctime)s: 로그가 발생한 시간을 표시합니다.
      • %(levelname)s: 로그의 심각도 레벨(예: DEBUG, INFO, WARNING, ERROR)을 나타냅니다.
      • %(message)s: 로그 메시지 자체가 표시됩니다.
    • 최종 출력 형식 예시는 [2024-10-31 12:00:00] [INFO] 서버가 시작되었습니다와 같습니다.
  3. handlers:
    • 로그가 어디로 출력될지 정의하는 부분입니다. 여기서는 console이라는 핸들러가 사용되고 있습니다.
    • console 핸들러 설정:
      • class: 로그를 콘솔에 출력하는 StreamHandler 클래스를 사용합니다.
      • level: INFO 레벨 이상의 로그만 출력되도록 설정합니다.
      • formatter: simple 포매터를 사용해 로그 형식을 지정합니다.
      • stream: ext://sys.stdout를 통해 표준 출력 스트림으로 출력됩니다.
  4. loggers:
    • 특정 로거를 정의하는 부분입니다. 여기서는 simpleExample라는 로거가 정의되어 있습니다.
    • simpleExample 로거 설정:
      • level: DEBUG 레벨 이상의 로그를 수집합니다.
      • handlers: 로그 출력에 console 핸들러를 사용합니다.
      • propagate: False로 설정하여, 상위 로거로 로그가 전파되지 않게 합니다.
  5. root:
    • 기본 로거의 설정입니다. 별도의 로거가 정의되지 않은 경우 이 루트 로거가 적용됩니다.
    • root 설정:
      • level: 기본 로깅 레벨을 DEBUG로 설정하여 모든 레벨의 로그를 기록합니다.
      • handlers: console 핸들러를 사용해 모든 로그를 콘솔에 출력합니다.

요약

이 로깅 설정 파일은 모든 로그를 콘솔에 출력하도록 구성되었으며, 기본적으로 DEBUG 레벨부터 모든 로그를 기록하도록 설정되어 있습니다. simpleExample 로거는 DEBUG 레벨 이상을 수집하며, root는 모든 로거가 이 설정을 따르도록 구성됩니다.

--log-config 옵션을 통해 로깅 설정을 세밀하게 조정하면, 시스템 상태 파악과 디버깅에 매우 유용하게 활용할 수 있습니다.