Python 강좌 / 오류 메시지 읽고 디버거·logging으로 문제 찾기

오류를 찾을 때는 traceback의 마지막 예외와 관련 파일·줄을 먼저 확인하고 입력값을 재현합니다. 디버거는 실행 중 상태를 살펴보는 도구이며 logging은 프로그램이 남길 운영 기록을 수준별로 관리하는 도구입니다.

Traceback을 읽는 순서

마지막 줄에서 예외 종류와 메시지를 읽고, 그 위에서 자신의 코드가 나온 파일·줄을 찾습니다. 호출 경로가 길어도 라이브러리 코드를 무작정 수정하기 전에 어떤 입력과 설정으로 호출했는지 재현합니다. 재현 가능한 최소 예제를 만들면 원인과 관련 없는 변수를 줄일 수 있습니다.

관련 동작과 지원 조건은 Python: logging에서 확인할 수 있습니다.

VS Code에서는 중단점을 걸고 변수 값, 호출 스택, 다음 실행 줄을 확인합니다. 문제가 발생하기 전의 입력을 관찰해야 하며 실패 후 print만 늘리는 것으로 모든 원인이 드러나지는 않습니다.

예외 전달과 실패 자동 확인은 예외 처리하기: try·except·else·finally·raise 및 자동 테스트 작성하기: unittest와 경계값 검사에서 사용하는 규칙과 연결됩니다.

전체 예제와 실행 결과

별도의 실습 폴더에서 아래 파일을 UTF-8로 저장합니다. 가상환경을 선택한 터미널에서 python logging_demo.py 명령으로 실행합니다. macOS·Ubuntu에서 가상환경을 사용하지 않는 경우 명령 이름을 python3으로 바꿉니다.

logging_demo.py 파일의 전체 내용입니다.

import logging

logging.basicConfig(level=logging.INFO, format="%(levelname)s:%(message)s")
logger = logging.getLogger(__name__)

def calculate(amounts):
    logger.debug("count=%s", len(amounts))
    if any(x < 0 for x in amounts):
        raise ValueError("negative amount")
    return sum(amounts)

try:
    total = calculate([3500, 8000, 2500])
except ValueError:
    logger.exception("calculation failed")
    raise SystemExit(1)
else:
    logger.info("total=%s", total)
print("finished")

예상 결과는 다음과 같습니다.

finished

기록 수준과 출력 채널

DEBUG는 상세 진단, INFO는 일반 진행, WARNING은 주의할 상황, ERROR는 실패를 나타내는 데 사용합니다. 실제 분류는 운영 정책에 맞춰 일관되게 정합니다. 예제의 INFO 설정에서는 DEBUG 메시지가 출력되지 않습니다.

logging은 기본 설정에서 표준 오류로, print는 표준 출력으로 나갑니다. 두 채널을 합쳐 보는 도구에서는 순서가 달라 보일 수 있습니다. 예제에서 표준 출력은 finished이고 로그에는 INFO:total=14000이 남습니다. 파일에 기록하려면 경로·회전·보존 기간·접근 권한도 정해야 합니다.

logging은 기록만 하며 실패 종료를 자동으로 만들지 않습니다. 위 수정본은 복구할 수 없는 ValueError를 기록한 뒤 SystemExit(1)로 종료하므로 음수 실험에서는 finished가 출력되지 않습니다. 정상 입력은 INFO 기록과 finished를 남기고 종료 0입니다. 명령 직후 PowerShell은 $LASTEXITCODE, macOS·Ubuntu 셸은 echo $?로 확인합니다. stdout과 stderr를 따로 수집하면 로그와 일반 출력의 관찰 순서가 달라질 수 있습니다.

이 동작과 적용 조건의 공식 설명: Python: sys.exit

고의 오류로 진단 과정을 연습하기

  1. 금액 하나를 -1로 바꾸어 실패 로그와 traceback이 남는지 확인합니다.
  2. DEBUG 수준으로 바꾸면 count=3이 추가되는지 확인합니다.
  3. 예외를 except Exception: pass로 숨기는 대신 필요한 문맥을 남기고 실패 상태를 전달하도록 설계합니다.

비밀번호·인증 헤더·전체 개인정보 데이터를 로그에 쓰지 않습니다. 반복문 안에서 큰 객체를 매번 출력하면 성능과 저장 공간에도 영향을 주므로 필요한 값만 기록합니다. 사용자 안내와 개발자 진단 기록의 목적을 구분하세요.