FastAPI 로깅 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki
- 로깅 방식들을 공부해서 최적의 방식을 적용한다.
-
https://github.com/Delgan/loguru?tab=readme-ov-file
from loguru import logger logger.debug("끝났어요! 아름답고 단순한 로깅입니다!")
-
https://stopmin.tistory.com/entry/Python-FastAPI-Logging-correlation-ID-uuid
-
전역 객체 logger를 이용하여 로그를 남길 수 있다
-
디폴트는 stderr(터미널 출력)에 로그를 남긴다
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: 예외 발생 줄의 지역 변수 값까지 표시됨
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()를 통해 로그 문자열에서 패턴 추츨 가능 → 로그 분석용
logger.opt(lazy=True).debug("계산 결과: {}", lambda: expensive_func())- lazy=True를 주면, 로그가 실제로 찍힐 때만 람다 함수가 실행된다
- 위 코드는 로그 레벨이 디버그보다 낮을 때 굳이 실행하지 않아도 되도록 작성된 코드
- 지역 변수에는 보안에 민감한 정보가 있을 수 있으므로 이용에 주의해야 한다.
- Loguru → logging 전달
- logging → Loguru 라우팅