부제 : “점점 코드가 커질수록 정리된 로그가 필요하더라고요”
서론
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를 써야 할까?
항목 | 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"가 아니다.
코드의 흐름을 기록하는 리포터, 예상치 못한 에러를 잡아주는 탐지기, 운영 환경에서 문제를 추적할 수 있는 생명줄이 된다.
'Dev > Python' 카테고리의 다른 글
[FastAPI] 예외 응답도 CommonResponse로 처리하는 이유 (0) | 2025.04.18 |
---|---|
[Python] setup.py와 requirements.txt는 뭐가 다를까? (0) | 2025.04.15 |
[Python] db.flush()는 언제, 왜 사용하는가? (0) | 2025.04.12 |
[Python] db.flush() Service/CRUD 계층 분리 구조에서의 실전 예제 (0) | 2025.04.11 |
튜플 (Tuple) - 여러 값을 묶는 간단하고 효율적인 방법 (2) | 2025.04.10 |