본문 바로가기

[Python] print만 쓰다가 logging으로 바꾼 이유 (파이썬 로깅 입문기)

@Jeeqong 2025. 4. 14. 14:47
반응형

부제 : “점점 코드가 커질수록 정리된 로그가 필요하더라고요”

 

서론

Prolog

파이썬을 처음 배우기 시작하면 대부분 책이나 강의에서 가장 먼저 알려주는 건 print() 문이다.

프로그램이 잘 돌아가는지 확인할 때마다 "여기까지 왔나?" 하고 print("ok")를 찍어보게 된다.

근데 나처럼 실무 프로젝트를 하다 보면 문득 이런 생각이 든다.

“프린트가 너무 많다…”

“에러 메시지 안 보인다…”

“이거 운영 환경에서도 프린트 찍히는 거 맞아?”

그러면서 슬슬 궁금해진다.

개발자들이 말하는 로깅은 뭐지?


본문

로깅(logging)이란?

logging은 파이썬 표준 라이브러리로, print() 대신 메시지를 더 체계적으로 기록할 수 있게 해주는 도구다.

일반적으로는 아래와 같은 용도로 사용된다.

  • 디버깅을 위한 로그 출력
  • 코드 흐름 확인 or 프로그램 동작 흐름 추적
  • 운영 환경에서 에러 상황 기록
  • 사용자 행동/데이터 기록 등
  • 운영 환경에서 문제 진단 (※ 여긴 print 쓰면 큰일 남…)

무엇보다 좋은 점은,

logging은 파이썬에 기본으로 포함된 기능이라서 별도 설치 없이 import logging만으로 사용할 수 있다.

단, 출력을 위해서는 logging.basicConfig() 같은 기본 설정은 꼭 필요하다.

VSCode, PyCharm, Cursor AI 등 어떤 에디터에서도 추가적인 설치나 환경 설정 없이 작동하지만, 초기 설정을 안 하면 콘솔에 아무것도 안 보일 수 있다! 설정을 안할경우 WARNING 이상 레벨만 출력되거나 아예 아무것도 출력 안하는 경우도 있다.


설정 방법

logging.basicConfig() 설정

main.py나 config.py에 아래 코드를 한 줄 추가하면 된다:

import logging

logging.basicConfig(
    level=logging.INFO,  # DEBUG, INFO, WARNING, ERROR, CRITICAL
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)

🛠 .env랑 연동 중이라면?

import os
import logging

LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO")
LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"

logging.basicConfig(level=LOG_LEVEL, format=LOG_FORMAT)

💡 팁

  • level=logging.DEBUG로 바꾸면 더 자세한 로그 확인 가능
  • basicConfig()는 딱 한 번만 실행되면 됨
  • 여러 번 설정하면 무시될 수 있으니, 초기 실행 지점(config.py 등)에 넣자!
  • 로깅은 설정 한번 해두면 전역에서 사용 가능

왜 print() 대신 logger를 써야 할까?

항목 print logging
메시지 수준 구분 ❌ 불가능 ✅ 가능 (info, error, warning, debug, critical)
운영 환경 사용 ❌ 쓰면 안 됨 ✅ 파일 저장, 필터링 등 가능
관리 가능성 ❌ 텍스트만 덜렁 ✅ 시간, 파일명, 로그레벨 자동 포함
포맷 설정 ❌ 없음 ✅ 커스터마이징 가능
로그 레벨 조절 ❌ 불가능 ✅ 예: DEBUG만 보이게 설정 가능

예제: print로 찍은 코드

print("✅ 크롤링 시작")
print("❌ 에러 발생:", e)

예제: logging으로 바꾼 코드

import logging

logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)

logger.info("✅ 크롤링 시작")
logger.error("❌ 에러 발생: %s", e)

실제 사용 예시

import logging

# 1. 기본 설정
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)

# 2. 로거 객체 생성
logger = logging.getLogger(__name__)

# 3. 사용
logger.info("크롤링 시작")
logger.warning("데이터가 없습니다")
logger.error("에러 발생", exc_info=True)

이렇게 하면 로그가 아래처럼 예쁘게 출력된다:

2025-04-03 15:12:00 - scraper.jobs.crawler - INFO - 크롤링 시작
2025-04-03 15:12:01 - scraper.jobs.crawler - WARNING - 데이터가 없습니다
2025-04-03 15:12:02 - scraper.jobs.crawler - ERROR - 에러 발생

마무리하며

처음엔 "그냥 print 찍으면 되지" 싶다. 나도 그랬다.

그런데 프로젝트가 커지고, 팀원이 생기고, 운영 환경까지 가게 되면 print()는 더는 답이 아니다.

logging은 단순히 "기능 많은 print"가 아니다.

코드의 흐름을 기록하는 리포터, 예상치 못한 에러를 잡아주는 탐지기, 운영 환경에서 문제를 추적할 수 있는 생명줄이 된다.

 

반응형
Jeeqong
@Jeeqong :: JQVAULT

Jeeqong's vault : 정보/기록을 쌓아두는 공간 웹개발 포스팅 일상 리뷰를 기록하는 공간입니다.

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차