728x90

소프트웨어 개발 과정에서 코드가 의도한 대로 동작하는지 확인하는 과정은 필수적입니다. 많은 입문자가 가장 먼저 접하는 방법은 print() 함수를 사용하는 것이지만, 프로젝트의 규모가 커질수록 이 방식은 한계에 부딪힙니다. 본 가이드에서는 파이썬의 Logging 모듈을 활용하여 시스템의 상태를 체계적으로 기록하는 방법과, 단순 출력 방식과의 근본적인 차이점을 심도 있게 분석합니다.
1. 왜 단순 출력만으로는 부족한가?
개발 초기 단계에서 print()는 매우 직관적입니다. 하지만 운영 환경(Production)으로 넘어가면 다음과 같은 문제들이 발생합니다.
- 제어의 어려움: 특정 부분의 출력만 끄거나 켜는 것이 불가능하며, 일일이 코드를 삭제해야 합니다.
- 정보의 부재: 출력된 내용이 언제, 어느 파일의 몇 번째 줄에서 발생했는지 알 수 없습니다.
- 기록의 영속성: 콘솔 창이 닫히면 출력된 데이터는 사라지며, 파일로 저장하기 위한 추가 작업이 번거롭습니다.
2. Logging과 print의 3가지 핵심 차이 및 비교
로그 시스템은 단순히 텍스트를 보여주는 것을 넘어, 소프트웨어의 생애 주기를 관리하는 데이터 핵심 엔진 역할을 합니다.
| 비교 항목 | print() 함수 | Logging 모듈 |
|---|---|---|
| 목적 | 단순 정보 출력 및 즉각적인 확인 | 프로그램 흐름 추적 및 이벤트 기록 |
| 출력 제어 | 불가능 (전체 출력 또는 삭제) | 심각도(Level)에 따른 선별적 출력 가능 |
| 유연성 | 표준 출력(Console)에 한정 | 파일, 이메일, HTTP 서버 등 전송 가능 |
| 메타데이터 | 내용만 출력 | 시간, 모듈명, 로그 레벨, 라인 번호 포함 |
3. Python Logging Level의 체계적인 이해
로그에는 우선순위가 있습니다. 파이썬에서는 기본적으로 5가지 표준 레벨을 제공하여 상황에 맞는 해결 방법을 제시합니다.
- DEBUG (10): 상세한 정보. 문제 진단 시에만 사용.
- INFO (20): 작동 확인 등 일반적인 메시지.
- WARNING (30): 예상치 못한 일이 발생했거나 향후 문제 발생 가능성이 있을 때 (기본값).
- ERROR (40): 중대한 문제로 인해 일부 기능이 작동하지 않을 때.
- CRITICAL (50): 프로그램 자체가 실행 불가능한 치명적인 상황.
4. [Sample Example] 실무형 로깅 설정 방법
단순히 콘솔에 찍는 것이 아니라, 파일로 저장하면서 포맷을 지정하는 전문적인 구성 예시입니다.
import logging
# 1. 로거 생성
logger = logging.getLogger("MyServiceLogger")
logger.setLevel(logging.DEBUG)
# 2. 포맷터 설정 (시간, 로그이름, 레벨, 메시지)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 3. 핸들러 설정 (파일 저장 및 콘솔 출력)
file_handler = logging.FileHandler('app_runtime.log')
file_handler.setFormatter(formatter)
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
# 4. 로거에 핸들러 추가
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
# 실전 사용 예시
def divide_numbers(a, b):
try:
result = a / b
logger.info(f"나눗셈 성공: {a} / {b} = {result}")
return result
except ZeroDivisionError:
logger.error("0으로 나눌 수 없는 오류가 발생했습니다.")
return None
divide_numbers(10, 2)
divide_numbers(5, 0)
5. 결론: 전문가를 위한 로깅 전략
규모 있는 프로젝트를 관리하는 개발자라면 print의 유혹에서 벗어나야 합니다. Logging을 사용하면 개발 환경에서는 모든 세부 사항(DEBUG)을 확인하고, 실제 서비스 중인 서버에서는 중요한 경고(WARNING) 이상만 기록하도록 코드 수정 없이 설정 파일만으로 변경할 수 있습니다. 이것이 바로 유지보수가 가능한 코드와 그렇지 않은 코드의 01순위 차이점입니다.
참고 문헌 및 출처
- Python Software Foundation. "Logging HOWTO". Official Python Documentation.
- Real Python. "Logging in Python: A Developer’s Guide".
- Stack Overflow Architecture Series. "Best practices for logging in production".
728x90