FastAPI 로깅 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

1. 개요

  • 로깅 방식들을 공부해서 최적의 방식을 적용한다.

2. Loguru 라이브러리

가. 참고 자료

나. 터미널 출력 로깅

import sys

logger.add(sys.stderr, format="{time} {level} {message}", filter="my_module", level="INFO")
  • add()를 이용해서 로그를 어디에 남길지 설정할 수 있다

다. 로그 파일

logger.add("file.log", rotation="1 week", retention="10 days", compression="zip")
  • rotation으로 용량, 시간, 주기 선정 가능하다
  • retention으로 오래된 로그 삭제 가능하다
  • compression으로 압축 형식 지정 가능하다

라. 로그 색깔 입히기

logger.add(sys.stdout, colorize=True, format="<green>{time}</green> <level>{message}</level>")
  • ANSI 지원 터미널일 경우 컬러 출력이 가능하다

마. 예외 자동 로깅

@logger.catch
def my_function(x, y, z):
    return 1 / (x + y + z)
  • 함수에 @logger.catch 붙여서 예외 발생 시 로그 자동 기록되도록 할 수 있다
  • 데코레이터를 이용해서 예외가 발생했을 때 프로그램이 중단되지 않고, 예외 정보가 자동으로 로그에 출력되도록 한다

바. 스택 트레이스와 변수 값까지 출력

logger.add("logfile.log", backtrace=True, diagnose=True)
  • backtrace=True: 예외 발생 시 전체 스택 트레이스 출력
  • diagnose=True: 예외 발생 줄의 지역 변수 값까지 표시됨

사. 구조화 로그 (JSON 직렬화 포함)

logger.add("log.json", serialize=True)  # 로그를 JSON 문자열로 저장
logger.bind(user="dahyun", ip="192.168.0.1").info("사용자 로그인")
  • .bind()로 context를 추가할 수 있다 → 필드 기반 필터링에도 유용하다

    {
      "time": "2025-05-02T15:00:00",
      "level": "INFO",
      "message": "로그인 시도",
      "extra": {
        "user": "dahyun",
        "ip": "192.168.0.1"
      }
    }
  • .contextualize()는 with 블록 전체에 바인딩 적용한다 (즉, 블록에 포함된 로그에 모두 user=dahyun이 자동 포함된다

    with logger.contextualize(user="dahyun"):
        logger.info("로그인")
        logger.info("조회")

아. 로깅 레벨 사용자 정의 가능

logger.level("SNAKY", no=38, color="<yellow>", icon="🐍")
logger.log("SNAKY", "커스텀 레벨 로그 메시지")
  • 기본 INFO, DEBUG 외에 커스텀 레벨도 쉽게 추가 가능하다

자. 로그 파싱 및 분석 가능

for entry in logger.parse("file.log", pattern=r"{time} - {level} - {message}"):
    print(entry)
  • .parse()를 통해 로그 문자열에서 패턴 추츨 가능 → 로그 분석용

차. Lazy Evaluation (opt(lazy=True))

logger.opt(lazy=True).debug("계산 결과: {}", lambda: expensive_func())
  • lazy=True를 주면, 로그가 실제로 찍힐 때만 람다 함수가 실행된다
  • 위 코드는 로그 레벨이 디버그보다 낮을 때 굳이 실행하지 않아도 되도록 작성된 코드

카. diagnose 사용 시, 보안 주의

  • 지역 변수에는 보안에 민감한 정보가 있을 수 있으므로 이용에 주의해야 한다.

타. 표준 로깅 라이브러리와 호환

  • Loguru → logging 전달
  • logging → Loguru 라우팅
⚠️ **GitHub.com Fallback** ⚠️