Python Logging: 커스텀 로거로 관리

본 글은 Claude Sonnet 4로 작성 후, 수정한 글입니다.


기본적인 logging 사용법

import logging

# 기본 설정
logging.basicConfig(
    level=logging.DEBUG, 
    format="[%(asctime)s] %(levelname)s: %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
)

# 로그 메시지 출력
logging.info("정보 메시지")
logging.warning("경고 메시지")
logging.error("오류 메시지")

커스텀 로거 만들기

이제 핵심인 커스텀 로거를 만들어보자. 이렇게 하면 다른 라이브러리의 로그와 섞이지 않는다.

import logging

# 커스텀 로거 생성
logger = logging.getLogger('MyApp')  # 이름을 지정하면 독립적인 로거가 된다
logger.setLevel(logging.INFO)

# 핸들러 설정 (콘솔 출력)
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

# 부모 로거로 전파 방지 (중요!)
logger.propagate = False

# 사용 예시
logger.info("애플리케이션 시작")
logger.warning("이것은 경고 메시지")
logger.error("오류가 발생했다")

다른 라이브러리 로그 제어하기

사용하는 라이브러리들이 너무 많은 로그를 출력할 때 제어하는 방법이다.

import logging
import requests  # 예시로 requests 라이브러리 사용

# 우리의 커스텀 로거 설정
logger = logging.getLogger('MyApp')
logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(message)s'))
logger.addHandler(handler)
logger.propagate = False

# 다른 라이브러리들의 로그 레벨 조정
logging.getLogger('urllib3').setLevel(logging.WARNING)  # requests가 사용하는 urllib3
logging.getLogger('requests').setLevel(logging.WARNING)
logging.getLogger('tensorflow').setLevel(logging.WARNING)  # tensorflow 사용시
logging.getLogger('matplotlib').setLevel(logging.WARNING)  # matplotlib 사용시

# 이제 우리 로그만 깔끔하게 나온다
logger.info("HTTP 요청 시작")
response = requests.get('https://httpbin.org/get')  # requests 로그는 안보임
logger.info(f"응답 상태: {response.status_code}")

마무리

Python의 logging 라이브러리는 처음엔 복잡해 보이지만, 한 번 제대로 설정해두면 디버깅과 모니터링이 훨씬 쉬워진다. 특히 커스텀 로거를 사용하면 다른 라이브러리들의 로그와 섞이지 않아 깔끔하게 관리할 수 있다.

핵심은 다음과 같다:

  • 로거에 고유한 이름을 부여한다
  • propagate=False로 부모 로거로의 전파를 막는다
  • 외부 라이브러리 로거의 레벨을 조정한다
  • 적절한 포맷터를 사용해 가독성을 높인다