운영 코드에서 print는 구조, 등급, 목적지를 제어하기 어렵다. logging은 모듈별 로거와 처리기를 제공한다.

import logging

logger = logging.getLogger(__name__)

def load_game(code: str) -> None:
    logger.info("game load code=%s", code)

로그 인자는 f-string보다 별도 인자로 넘기면 해당 레벨이 꺼졌을 때 문자열 계산을 피할 수 있다. 예외를 처리하는 곳에서는 `logger.exception`이 현재 traceback을 포함한다.

설정은 코드에 비밀값을 하드코딩하지 않고 환경변수나 권한이 제한된 비밀 저장소에서 읽는다. 기본값이 안전한 로컬 주소인지 확인하고, 운영 필수값이 없으면 시작 단계에서 명확히 실패한다.

라이브러리는 루트 로깅 설정을 바꾸지 않는다. 애플리케이션 진입점이 포맷, 레벨, 출력 위치를 정한다. JSON 로그는 수집 시스템에서 검색하기 좋지만 사람이 보는 개발 로그와 목적을 구분한다.

Python 22. 로깅과 설정 관리의 핵심 흐름도
그림. 로그에는 진단에 필요한 사실만 남기고 비밀값은 제외한다.