본문 바로가기
자기개발/코딩, 데이터분석

[코딩 프로젝트] print() vs logger.exception() 차이 정리

by 공부하는노아 2025. 11. 13.

최근에 예외 처리 코드를 손보면서,
그동안 습관처럼 쓰던 print(e) 대신 logger.exception()을 쓰는 게 왜 중요한지 한 번 정리해 두기로 했다.
아래 내용은 개념정리 + 나중에 코드 리팩터링할 때 참고하려는 목적의 기록이다.


1. 겉으로는 비슷하지만, 역할은 완전히 다르다

예외가 발생했을 때 보통 이런 코드를 많이 쓴다.

 
print(f"오류 발생: {e}")

logger.exception("프로그램 실행 중 오류 발생: %s", e)
 

겉으로 보기에는 둘 다 “에러 메시지를 찍는 코드”지만, 실제로 하는 일의 수준은 다르다.

  • print()
    • 문자열만 그대로 콘솔에 출력한다.
    • “에러가 났다”는 사실만 알려주는 수준.
  • logger.exception()
    • 메시지 + 전체 Traceback(호출 스택) 을 함께 남긴다.
    • 에러가 어느 함수에서, 어떤 호출 흐름을 타고 올라오다가 터졌는지까지 기록해 준다.

평소에 단순 스크립트만 돌릴 때는 print(e)로도 버틸 수 있지만,
코드 규모가 커지거나 자동화/상시 실행되는 프로그램이 되면 둘의 차이가 크게 난다.


2. 핵심 포인트: logger.exception()은 Traceback 전체를 남긴다

print(f"오류 발생: {e}")를 쓰면 대략 이런 형태의 출력만 남는다.

 

 

이 정보만으로는:

  • 어떤 함수에서 이 파일을 읽으려 했는지
  • 어떤 호출 순서를 거쳐 이 지점까지 왔는지

전혀 알 수 없다.

같은 상황에서 logger.exception("프로그램 실행 중 오류 발생: %s", e)를 쓰면 예시는 다음과 같다.

 
2025-11-13 15:40:00 - ERROR - 프로그램 실행 중 오류 발생: 'keywords_input.xlsx' 파일을 찾을 수 없습니다.

Traceback (most recent call last):
  File "telegram_monitor_advanced.py", line 305, in start
    asyncio.run(self._run_client())
  File "telegram_monitor_advanced.py", line 291, in _run_client
    await self.notifier.start()
  File "telegram_monitor_advanced.py", line 125, in load
    df = self._read_excel()
  File "telegram_monitor_advanced.py", line 116, in _read_excel
    return pd.read_excel(self.excel_file_path, engine="openpyxl")
FileNotFoundError: 'keywords_input.xlsx' 파일을 찾을 수 없습니다.
 

이 로그 한 덩어리만 보면:

  • 116행: _read_excel()에서 예외 발생
  • 125행: load()가 해당 함수를 호출
  • 291행: _run_client()가 load()를 호출
  • 305행: 최상위 start() 진입점에서 시작

까지 호출 흐름이 그대로 드러난다.
즉, logger.exception()은 단순 메시지 출력이 아니라 사고 경위 전체를 기록하는 기능에 가깝다.


3. print()에는 없는 “로그 레벨” 개념

print()는 한 번 넣어 두면,
코드를 지우거나 주석 처리하지 않는 이상 항상 출력된다.

반대로 logging은 레벨 개념이 있어서,
필요한 심각도 이상의 로그만 골라서 볼 수 있다.

대표적인 레벨은 아래와 같다.

 

초기 설정 예시는 이렇게 잡는다.

 
  •  

이처럼 설정 한 줄만 조정하면,
기존에 넣어 둔 logger.debug(), logger.info() 코드를 굳이 지우지 않아도 된다.
나중에 로그 노이즈를 줄이고 싶을 때도 레벨만 조정하면 된다.


4. 로그를 “어디에 남길지”를 선택할 수 있다

print()는 출력 위치가 항상 콘솔(표준 출력) 로 고정되어 있다.

하지만 서버에서 24시간 돌아가는 스크립트를 생각해 보면:

  • 새벽에 예외가 발생해서 프로그램이 종료되었을 때
  • 이미 터미널 세션이 끊어져 있으면, 당시 콘솔 출력은 사실상 복구 불가능하다.

logging 모듈은 파일 로그 설정을 통해 이 문제를 해결할 수 있다.

 

 

이렇게 설정하면:

  • 콘솔에 굳이 찍지 않더라도
  • app.log 파일만 열어 보면
    예외 메시지 + 전체 Traceback이 모두 기록되어 있다.

결과적으로 logger.exception()은 코드에 “블랙박스”를 장착하는 것에 가깝다고 정리할 수 있다.


5. 정리 및 앞으로의 활용 방향

이번에 정리하면서 남겨 둔 개인 메모는 다음 세 가지다.

  1. 예외 처리 구간에서 print(e)만 사용하는 구조는
    규모가 커지면 디버깅 비용이 크게 올라간다.
  2. 예외 처리의 기본 패턴은
    try/except + logger.exception() 조합으로 가져가는 것이 낫다.
  3. 로그는 “지금 잘 보이는가?”보다
    "나중에 원인을 역추적할 수 있는가?”를 기준으로 설계해야 한다.
반응형