Django를 활용한 웹 애플리케이션 개발과 운영에서 데이터 로깅은 빠질 수 없는 요소입니다. 로그는 시스템 상태를 파악하고, 오류를 추적하며, 사용자 활동을 기록하는 등 다양한 목적에 사용됩니다. 특히, 로그 레벨을 적절히 활용하면 문제를 빠르게 해결하고, 운영 효율성을 극대화할 수 있습니다.
이 글에서는 Django에서 로깅을 설정하는 방법, 각 로그 레벨의 의미와 사용법, 그리고 실무에 유용한 로깅 전략을 소개합니다. 더불어, RotatingFileHandler를 사용한 로그 관리 방법도 함께 다뤄보겠습니다.
로깅은 단순히 메시지를 기록하는 것을 넘어, Django 프로젝트의 성공적인 운영을 위해 필수적인 역할을 합니다. 주요 이유는 다음과 같습니다
문제 진단
오류가 발생했을 때 로그를 통해 원인을 빠르게 파악할 수 있습니다.
운영 상태 모니터링
시스템의 성능 병목현상과 비정상적인 동작을 발견할 수 있습니다.
보안 강화
의심스러운 활동을 기록하여 보안 사고를 예방하고 대응합니다.
감사 및 추적
누가, 언제, 무엇을 했는지 기록으로 남길 수 있습니다.
Django와 Python의 표준 logging 라이브러리를 활용하면 이러한 로그 데이터를 효율적으로 관리할 수 있습니다.
Python의 logging 라이브러리에서 제공하는 주요 로그 레벨과 그 역할은 아래와 같습니다:
| 로그 레벨 | 설명 | 사용 예제 |
|---|---|---|
| DEBUG | 개발 중 상세한 정보를 기록합니다. | 디버깅용 API 요청 및 응답 기록 |
| INFO | 일반적인 동작과 상태를 기록합니다. | 사용자 로그인 성공 기록 |
| WARNING | 주의가 필요한 경고 메시지를 기록합니다. | 비정상적인 요청 감지 |
| ERROR | 시스템에 영향을 미치는 에러를 기록합니다. | 데이터베이스 연결 실패 |
| CRITICAL | 치명적인 오류를 기록합니다. 시스템 전체가 영향을 받을 수 있는 문제를 다룹니다. | 서버 다운, 심각한 리소스 부족 |
Django 프로젝트에서 로깅은 settings.py의 LOGGING 설정을 통해 구성됩니다. 아래는 기본적인 로깅 설정 예제입니다:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '{levelname} {asctime} {module} {message}',
'style': '{',
},
'simple': {
'format': '{levelname} {message}',
'style': '{',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'verbose',
},
'file': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'debug.log',
'formatter': 'verbose',
},
},
'loggers': {
'django': {
'handlers': ['console', 'file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
import logging
logger = logging.getLogger(__name__)
def debug_example():
logger.debug("This is a DEBUG message.")
def user_login(username):
logger.info(f"User {username} logged in successfully.")
def deprecated_function():
logger.warning("This feature is deprecated and will be removed in future versions.")
def db_connection_error():
try:
# 데이터베이스 연결 코드
pass
except Exception as e:
logger.error("Database connection failed", exc_info=True)
def critical_error():
logger.critical("Critical system failure! Immediate attention required.")
활용 사례: 서버 다운과 같은 치명적인 문제를 기록합니다.
RotatingFileHandler는 로그 파일 크기가 일정 용량을 초과할 경우 새 파일을 생성하거나 오래된 파일을 교체합니다. 이를 통해 로그 파일이 과도하게 커지지 않도록 관리할 수 있습니다.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '{levelname} {asctime} {module} {message}',
'style': '{',
},
},
'handlers': {
'rotating_file': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': 'app.log',
'maxBytes': 5 * 1024 * 1024, # 파일 크기 제한 (5MB)
'backupCount': 3, # 백업 파일 최대 개수
'formatter': 'verbose',
},
},
'loggers': {
'django': {
'handlers': ['rotating_file'],
'level': 'DEBUG',
'propagate': True,
},
},
}
maxBytes: 한 파일의 최대 크기(바이트 단위)를 설정합니다.backupCount: 유지할 백업 파일의 개수를 설정합니다.filename: 로그가 저장될 파일 경로를 지정합니다.
Django에서 효율적인 로깅을 위해 다음 전략을 참고하세요:
로깅은 단순 기록을 넘어, 애플리케이션의 성능과 안정성을 높이는 중요한 도구입니다. 더 안정적인 서비스 운영을 위해 로깅을 적극적으로 활용하는것을 권장드려요!🚀
상담만 받아보셔도 좋습니다 긱다이브의 상담으로 업체 비교를 시작해보세요