예를 들어 새벽 예약 작업이 실패했다고 해볼게요. 아침에 로그를 열었는데 작업 실패 한 줄만 남아 있다면, 문제는 아직 반쯤만 기록된 셈이에요. 예외를 잡은 except 블록에서는 logger.exception()을 기본으로 쓰고, error() 호출을 유지해야 할 때는 exc_info=True를 넘기면 됩니다.
저는 여기서 로그를 남기는 일과 실패를 처리하는 일을 따로 봐요. 상위 실행기도 실패를 알아야 한다면 기록 뒤에 raise로 예외를 다시 전달해야 해요.
먼저 볼 곳은 예외를 잡은 자리예요
현재 예외를 처리하는 except 블록 안에서는 다음처럼 기록할 수 있어요.
import logging
logger = logging.getLogger(__name__)
try:
result = run_automation()
except Exception:
logger.exception("자동화 작업 처리 중 오류")
logger.exception()은 ERROR 수준으로 메시지를 남기면서 현재 예외 정보도 함께 기록해요. 그래서 예외 처리기 안에서 호출해야 합니다. 오류 한 줄만 남기던 로그에 호출 위치와 예외 흐름을 더하고 싶을 때 먼저 살펴볼 선택이에요.
기존 error() 흐름을 유지하고 싶다면
공통 로깅 함수에서 error()를 이미 사용하거나 기록 레벨을 호출부에서 정하고 있다면, exc_info=True를 더할 수 있어요.
try:
result = run_automation()
except OSError:
logger.error("결과 파일 저장 실패", exc_info=True)
예외를 잡은 except 블록에서 logger.error(..., exc_info=True)를 호출하면 ERROR 메시지와 현재 예외 정보를 함께 기록할 수 있어요. 반대로 예외 처리기 밖에서 이 옵션만 켜면, 기대한 현재 예외 정보가 없을 수 있으니 호출 위치부터 확인해 보세요.
둘 중 하나가 무조건 더 좋은 것은 아니에요. 예외 처리 자리에서 의도를 간결하게 드러내려면 logger.exception()이 편하고, 공통 함수의 error() 형식을 유지해야 한다면 exc_info=True가 자연스러워요.
로그를 남긴 뒤에도 실패를 알려야 할까요?
여기서 자주 헷갈리는 부분이 하나 있어요. 로그에 traceback을 썼다고 해서 예외가 자동으로 다시 전달되는 건 아닙니다.
try:
result = run_automation()
except Exception:
logger.exception("자동화 실행 실패")
raise
예외를 기록한 뒤 상위 실행기가 실패 처리를 맡아야 한다면 raise로 다시 전달해야 해요. 반대로 이 함수가 오류를 복구하고 대체 결과를 반환할 책임이 있다면, 어떤 예외를 처리할지 정한 뒤 복구 흐름으로 이어갈 수 있습니다.
저는 판단 기준을 이렇게 둬요. 로그는 원인을 나중에 찾기 위한 기록이고, raise는 호출자에게 작업 실패를 알리는 동작이에요. 둘 중 하나가 다른 하나를 대신하지 않습니다.
traceback이 안 보이면 기록 경로도 같이 봐요
logger.exception()이나 exc_info=True가 있어도 로그가 파일에 남지 않는다면, 설정이 전달되는 경로를 따라가야 해요. 해당 logger가 어느 handler로 연결되는지, logger와 handler의 level이 ERROR 메시지를 통과시키는지 확인해 보세요.
이 확인은 exc_info 옵션과 별개예요. 예외 정보는 요청했는데 handler가 메시지를 걸러내면 파일에서는 여전히 보이지 않을 수 있으니까요. 먼저 예외 처리기 안에서 호출하는지 확인하고, 그다음 logger와 handler의 level 및 파일 연결을 살펴보면 범위를 덜 헤매게 됩니다.
지금 고른 방식과 다음 점검
예외를 잡은 자리에서 traceback까지 기록하려면 logger.exception()부터 고려해 보세요. 기존 error() 구조를 유지하고 싶다면 exc_info=True를 지정하고, 상위 단계가 실패를 알아야 하는 경우에는 raise를 남겨야 합니다.
이 세 가지를 구분하면 “로그는 남았는데 자동화는 성공으로 끝난 것처럼 보이는” 혼란도 줄일 수 있어요. 파일 자체가 생성되지 않는 문제라면 파이썬 로그 파일이 안 생기는 이유와 logging 설정 점검법에서 설정 순서와 handler 쪽을 이어서 확인해 보세요.