1. 파이썬 로깅 완전 가이드 | 디버깅부터 프로덕션까지
파이썬으로 프로그램을 개발할 때, 로깅은 오류를 식별하고 동작을 검증하는 데 필수적입니다.
이 글에서는 기본 개념부터 실전 기술까지 모두 설명하여 파이썬 초보자도 로깅을 효과적으로 활용할 수 있도록 합니다.
2. 파이썬 로깅이란? 기본 개념과 필요성
로깅은 프로그램 실행 중 발생하는 정보와 오류를 기록하는 메커니즘입니다. 올바른 로깅 사용은 다음과 같은 이점을 제공합니다.
로깅의 장점
- 오류 분석이 쉬워짐 – 오류가 발생한 위치와 원인을 정확히 파악할 수 있습니다.
- 프로그램 동작 추적 – 어떤 부분이 정상적으로 실행되고 어디에서 문제가 발생하는지 확인할 수 있습니다.
- 운영 모니터링 활성화 – 프로덕션 환경에서 시스템 상태를 지속적으로 감시하는 기반이 됩니다.
print()와의 차이점
초보자들이 흔히 사용하는 print() 함수는 디버깅에 편리하지만, 본격적인 개발에서는 다음과 같은 한계가 있습니다.
- 출력 대상을 유연하게 지정할 수 없음(예: 파일이나 외부 서비스).
- 로그 레벨(심각도)을 관리할 수 없음.
이러한 문제는 파이썬 표준 logging 모듈을 사용하면 해결됩니다.

3. 파이썬 내장 logging 모듈로 로깅 시작하기
파이썬에는 내장 logging 모듈이 포함되어 있어 로그 출력을 손쉽게 할 수 있습니다. 이 섹션에서는 기본 사용법을 설명합니다.
로그 레벨 개요
logging 모듈은 로그 메시지의 심각도를 나타내는 “로그 레벨”을 설정할 수 있게 해줍니다. 주요 로그 레벨은 다음과 같습니다.
- DEBUG : 디버그 정보. 개발 단계에서 유용합니다.
- INFO : 일반적인 정보 메시지. 프로그램 진행 상황을 나타냅니다.
- WARNING : 경고. 잠재적인 문제를 알립니다.
- ERROR : 오류. 프로그램이 정상적으로 동작하지 않을 때 사용합니다.
- CRITICAL : 치명적인 오류. 시스템이 중단될 위험이 있음을 나타냅니다.
기본 사용법
아래는 logging 모듈을 이용한 간단한 로깅 예시입니다.
import logging
# Basic logging configuration
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# Example output for each log level
logging.debug('This is debug information.')
logging.info('This is an info message.')
logging.warning('This is a warning message.')
logging.error('This is an error message.')
logging.critical('This is a critical error message.')
코드 설명
basicConfig: 로깅 출력을 설정합니다.level인자를 통해 출력할 최소 로그 레벨을 지정할 수 있습니다.- 포맷 지정 :
format인자를 사용해 로그 메시지 형식을 커스터마이징합니다. - 예시:
%(asctime)s는 타임스탬프,%(levelname)s는 로그 레벨,%(message)s는 실제 메시지 내용을 나타냅니다.
4. 파이썬에서 로그를 파일 및 콘솔에 출력하기
로그는 화면에만 출력되는 것이 아니라 파일이나 외부 시스템에도 저장할 수 있습니다. 이 섹션에서는 다양한 출력 대상을 설정하는 방법을 설명합니다.
콘솔에 로깅하기
logging 모듈은 기본적으로 콘솔에 로그를 출력하도록 설정되어 있습니다.
import logging
logging.basicConfig(level=logging.INFO)
logging.info('Example of logging to the console')
파일에 로깅하기
파일에 로그를 기록하려면 basicConfig의 filename 인자를 지정하면 됩니다.
import logging
logging.basicConfig(filename='app.log', level=logging.INFO, format='%(asctime)s - %(message)s')
logging.info('This is an example of logging to a file.')
콘솔과 파일에 동시에 로깅하기
여러 출력 대상을 동시에 사용하려면 logging의 핸들러(handler)를 활용합니다.
import logging
# Create a logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
# Console handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# File handler
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.INFO)
# Configure the handler format
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# Add handlers to the logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)
logger.info('Example log that will be output to both the console and the file.')

5. Python 프로젝트에서의 효과적인 로깅 기법
이 섹션에서는 실제 프로젝트에서 유용한 로깅 모범 사례를 소개합니다. 효율적인 디버깅 기법과 로그 관리를 개선하는 방법을 배워보세요.
일관된 로깅 구성
대규모 프로젝트에서 일관된 로깅 구성은 중요합니다. 여러 모듈이나 팀원이 협업할 때, 통합된 형식과 로그 레벨을 설정하면 분석과 문제 해결이 더 쉬워집니다. 아래는 일관된 로깅 구성의 예입니다.
import logging
# Common logging configuration function
def setup_logger(name, log_file, level=logging.INFO):
handler = logging.FileHandler(log_file)
handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
logger = logging.getLogger(name)
logger.setLevel(level)
logger.addHandler(handler)
return logger
# Create loggers for each module
app_logger = setup_logger('app_logger', 'app.log')
db_logger = setup_logger('db_logger', 'db.log')
# Example of log output
app_logger.info('Application log message')
db_logger.error('Database error message')
오류 처리와 로깅 결합
오류 처리(예외 처리)에서 적절한 정보를 로깅하면 문제의 세부 사항을 빠르게 이해할 수 있습니다. 아래는 예외 발생 시 로깅 예입니다.
import logging
logging.basicConfig(filename='error.log', level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s')
try:
# Example code that raises an error
1 / 0
except ZeroDivisionError as e:
logging.error(f'A division-by-zero error occurred: {e}')
로그 메시지에 컨텍스트 정보 포함
프로젝트에 따라 로그 메시지에 추가 컨텍스트 정보(예: 사용자 ID, 트랜잭션 ID)를 포함하면 더 상세한 분석이 가능합니다.
import logging
logging.basicConfig(filename='context.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
user_id = 12345
transaction_id = 'txn_001'
logging.info(f'User ID: {user_id}, Transaction ID: {transaction_id} - Operation succeeded.')
적절한 로그 필터링
대량의 로그가 생성될 때, 필요한 로그만 출력하기 위해 필터링을 사용하는 것이 효과적입니다. 아래는 사용자 정의 필터의 예입니다.
import logging
class DebugFilter(logging.Filter):
def filter(self, record):
return record.levelno == logging.DEBUG
logger = logging.getLogger('filtered_logger')
handler = logging.StreamHandler()
handler.addFilter(DebugFilter())
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
logger.debug('This is a debug log.')
logger.info('This will not be displayed.')
6. Python 로깅을 강화하는 세 가지 추천 라이브러리
Python의 내장 logging 모듈 외에도 여러 편리한 로깅 라이브러리가 있습니다. 이 섹션에서는 특히 인기 있는 세 가지를 강조합니다.
Loguru: 초보자를 위한 간단한 로깅 라이브러리
기능:
- 쉬운 설치와 설정.
- 표준
logging보다 더 직관적인 구문.
설치:
pip install loguru
기본 사용법:
from loguru import logger
logger.info('This is log output using Loguru.')
logger.error('Error messages can be logged easily, too.')
Logzero: 가볍고 사용하기 쉬운 로깅 라이브러리
특징:
- 쉽게 커스터마이징 가능.
- 내장 로그 회전 기능.
설치:
pip install logzero
기본 사용법:
from logzero import logger
logger.info('Log output using Logzero')
logger.warning('This is a warning message.')
Structlog: 구조화된 로깅을 위한 특화 라이브러리
특징:
- JSON 형식으로 로그를 쉽게 출력합니다.
- 분산 시스템 및 클라우드 환경에 적합합니다.
설치:
pip install structlog
기본 사용법:
import structlog
logger = structlog.get_logger()
logger.info('event', user='12345', action='login')

7. Python 로깅에 대한 질문 해결!
Q1. 왜 로그가 출력되지 않나요?
답변:
로그 레벨이 적절히 설정되어 있는지 확인하세요. 기본적으로 WARNING 레벨 이상인 로그만 출력됩니다.
Q2. 로그 파일이 너무 커지면 어떻게 하나요?
답변: RotatingFileHandler를 사용하여 파일 크기가 일정 수준에 도달하면 로그 파일을 회전시킬 수 있습니다.
Q3. 서드파티 라이브러리를 어떻게 선택해야 할까요?
답변:
프로젝트의 규모와 요구사항에 따라 선택하세요. 작은 프로젝트에는 Loguru가 적합하고, 구조화된 로깅이 필요하면 Structlog가 더 적합합니다.
8. Python 로깅을 마스터하여 개발 효율성을 높이세요
이 글에서는 Python 로깅의 기본부터 고급 기법 및 유용한 서드파티 라이브러리까지 모두 다루었습니다. 적절한 로깅은 디버깅 효율 크게 향상시키고 시스템 모니터링의 정확성을 높일 수 있습니다. 오늘부터 바로 시도해 보세요!




