본 글은 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로 부모 로거로의 전파를 막는다
- 외부 라이브러리 로거의 레벨을 조정한다
- 적절한 포맷터를 사용해 가독성을 높인다