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

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

Traceback을 읽는 순서

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

관련 동작과 지원 조건은 오류 메시지 읽고 디버거·logging으로 문제 찾기 관련 공식 문서에서 확인할 수 있습니다.

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

전체 예제와 실행 결과

별도의 실습 폴더에서 아래 파일을 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")
else:
    logger.info("total=%s", total)
print("finished")

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

finished

기록 수준과 출력 채널

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

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

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

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

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