Django에서 로그를 간단히 사용하는 방법에 대해 설명합니다.
- 프로젝트 생성
django-admin startproject my_django_project
my_django_project/my_django_project/views.py 파일에 다음 내용 추가
import logging
from django.http import HttpResponse
def fun(request):
logging.info("정보 메시지")
logging.warning("경고 메시지")
logging.error("오류 메시지")
return HttpResponse()
라우팅 설정
my_django_project/my_django_project/urls.py
from django.urls import path
from .views import fun
urlpatterns = [
path('', fun),
]
기본적으로 warning 수준 이상의 로그만 콘솔에 출력됩니다.
- 기본적인 사용법
콘솔에 로그 출력하기 및 레벨 설정
my_django_project/settings.py 파일에 다음 내용 추가
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'root': {
'handlers': ['console'],
'level': 'DEBUG',
},
}
'disable_existing_loggers': False, # 이미 존재하는 로거를 비활성화 여부
예를 들어, 비활성화하면 utils/autoreload.py의 로그도 출력되지 않습니다.
사용자 정의 로거 추가
my_django_project/settings.py 파일에 LOGGING 내용 수정
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'root': {
'handlers': ['console'],
'level': 'DEBUG',
},
'loggers': {
'custom_logger': {
'handlers': ['console'],
'level': 'ERROR',
'propagate': False,
},
},
}
my_django_project/my_django_project/views.py 파일에 다음 내용 추가
import logging
from django.http import HttpResponse
def fun(request):
logging.info("정보 메시지")
logging.warning("경고 메시지")
logging.error("오류 메시지")
log = logging.getLogger('custom_logger')
log.info("사용자 정의 로거 정보 메시지")
log.warning("사용자 정의 로거 경고 메시지")
log.error("사용자 정의 로거 오류 메시지")
return HttpResponse()
사용자 정의 로거는 ERROR 수준 이상의 로그만 출력합니다.
파일에 로그 작성하기
my_django_project/settings.py 파일에 LOGGING 내용 수정
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
'write_file': {
'class': 'logging.FileHandler',
'filename': './logs/app.log',
}
},
'root': {
'handlers': ['console'],
'level': 'DEBUG',
},
'loggers': {
'custom_logger': {
'handlers': ['console'],
'level': 'ERROR',
'propagate': False,
},
'file_logger': {
'handlers': ['write_file'],
'level': 'DEBUG',
'propagate': False,
}
},
}
my_django_project/my_django_project/views.py 파일에 다음 내용 추가
import logging
from django.http import HttpResponse
def fun(request):
logging.info("정보 메시지")
logging.warning("경고 메시지")
logging.error("오류 메시지")
log = logging.getLogger('custom_logger')
log.info("사용자 정의 로거 정보 메시지")
log.warning("사용자 정의 로거 경고 메시지")
log.error("사용자 정의 로거 오류 메시지")
log = logging.getLogger('file_logger')
log.info("파일 로거 정보 메시지")
log.warning("파일 로거 경고 메시지")
log.error("파일 로거 오류 메시지")
return HttpResponse()
로그가 ./logs/app.log 파일에 작성됩니다.
로그 형식 지정하기
my_django_project/settings.py 파일에 LOGGING 내용 수정
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '[{levelname}][{asctime}][{module}][{process:d}][{thread:d}]{message}',
'style': '{',
},
'simple': {
'format': '[{levelname}]{message}',
'style': '{',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'verbose'
},
'write_file': {
'class': 'logging.FileHandler',
'filename': './logs/app.log',
'formatter': "simple"
}
},
'root': {
'handlers': ['console'],
'level': 'DEBUG',
},
'loggers': {
'custom_logger': {
'handlers': ['console'],
'level': 'ERROR',
'propagate': False,
},
'file_logger': {
'handlers': ['write_file'],
'level': 'DEBUG',
'propagate': False,
}
},
}
my_django_project/my_django_project/views.py 파일에는 변경 사항이 없습니다.
결과:
root 로거는 모든 로그를 출력합니다.
custom_logger는 ERROR 이상의 로그만 출력합니다.
file_logger는 ./logs/app.log 파일에 모든 로그를 출력합니다.
'propagate': False, # 로그 전달 여부
true로 설정하면 상위 로거로 전달됩니다.
참고:
-
file_logger의 'propagate':을 true로 변경하면 root 로거의 로그도 함께 출력됩니다.
-
custom_logger의 'propagate':을 true로 변경하면 두 번의 로그가 출력됩니다.
propagate 파라미터: propagate=0(로그 출력하지만 전달하지 않음), propagate=1(로그 출력하고 전달함)
필터 추가하기
my_django_project/settings.py 파일에 LOGGING 내용 수정
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '[{levelname}][{asctime}][{module}][{process:d}][{thread:d}]{message}',
'style': '{',
},
'simple': {
'format': '[{levelname}]{message}',
'style': '{',
},
},
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'verbose',
'filters': ["require_debug_true"]
},
'write_file': {
'class': 'logging.FileHandler',
'filename': './logs/app.log',
'formatter': "simple"
}
},
'root': {
'handlers': ['console'],
'level': 'DEBUG',
},
'loggers': {
'custom_logger': {
'handlers': ['write_file'],
'level': 'ERROR',
'propagate': False,
},
'file_logger': {
'handlers': ['write_file'],
'level': 'DEBUG',
'propagate': False,
}
},
}
DEBUG=False일 때 console은 출력되지 않음(필터 때문).
원문 코드는 다음과 같습니다:
사용자 정의 필터:
my_django_project/my_django_project/filter_log.py 파일에 입력 내용
import logging
class CustomFilterLog(logging.Filter):
def filter(self, record):
if 'c-' not in record.msg:
return False
return True
메시지에 'c-'가 없으면 로그를 기록하지 않습니다.
my_django_project/settings.py 파일에 LOGGING 내용 수정
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '[{levelname}][{asctime}][{module}][{process:d}][{thread:d}]{message}',
'style': '{',
},
'simple': {
'format': '[{levelname}]{message}',
'style': '{',
},
},
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
'custom_filter_log': {
'()': 'my_django_project.filter_log.CustomFilterLog',
}
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'verbose',
'filters': ["custom_filter_log"]
},
'write_file': {
'class': 'logging.FileHandler',
'filename': './logs/app.log',
'formatter': "simple"
}
},
'root': {
'handlers': ['console'],
'level': 'DEBUG',
},
'loggers': {
'custom_logger': {
'handlers': ['write_file'],
'level': 'ERROR',
'propagate': False,
},
'file_logger': {
'handlers': ['write_file'],
'level': 'DEBUG',
'propagate': False,
}
},
}
my_django_project/my_django_project/views.py 파일에 다음 내용 추가
import logging
from django.http import HttpResponse
from django.utils.log import RequireDebugTrue
def fun(request):
logging.info('c- 화하하하, 기록해주세요')
logging.info("정보 메시지")
logging.warning("경고 메시지")
logging.error("오류 메시지")
log = logging.getLogger('custom_logger')
log.info("사용자 정의 로거 정보 메시지")
log.warning("사용자 정의 로거 경고 메시지")
log.error("사용자 정의 로거 오류 메시지")
log = logging.getLogger('file_logger')
log.info("파일 로거 정보 메시지")
log.warning("파일 로거 경고 메시지")
log.error("파일 로거 오류 메시지")
return HttpResponse()
- 개인용 설정
LOG_NAME = Path(BASE_DIR).joinpath("logs", 'app.log')
if not Path(LOG_NAME).parent.exists():
print(f"로그 디렉토리 생성: {Path(LOG_NAME).absolute()}")
os.makedirs(Path(LOG_NAME).parent)
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
"verbose": {
"format": "[{levelname}][{asctime}][{pathname}:{lineno}][process:{process:d}][thread:{thread:d}]{message}",
"style": "{",
},
"simple": {
"format": "[{levelname}]{message}",
"style": "{",
},
},
'filters': {
},
'handlers': {
'RotatingFileHandler': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': LOG_NAME,
'maxBytes': 1024 * 1024 * 5,
'backupCount': 20,
'formatter': 'verbose',
'encoding': "utf-8"
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
},
'loggers': {
'console': {
'handlers': ['console'],
'level': 'DEBUG',
'propagate': False,
},
'rotating_file': {
'handlers': ['console', 'RotatingFileHandler'],
'level': 'INFO',
'propagate': False,
},
'root': {
'handlers': ['console', 'RotatingFileHandler'],
'level': 'INFO',
'propagate': False,
}
}
}
출력 결과:
로그 형식 파라미터
| 포맷 | 설명 | 출력 |
|---|---|---|
| %(name)s | 로거 이름 | root |
| %(levelno)s | 숫자 형태의 로그 레벨 | 20 |
| %(levelname)s | 텍스트 형태의 로그 레벨 | INFO |
| %(filename)s | 로그 기록 호출의 소스 파일의 파일 이름 | views.py |
| %(pathname)s | 로그 기록 호출의 소스 파일의 경로 이름 | D:\Project\PythonProject\my_django_project\my_django_project\views.py |
| %(funcName)s | 로그 기록 호출의 함수 이름 | fun |
| %(module)s | 로그 기록 호출의 모듈 이름 | views |
| %(lineno)s | 로그 기록 호출의 줄 번호 | 11 |
| %(created)s | 로그 기록 실행 시간 | 1653027145.2251844 |
| %(asctime)s | 날짜와 시간 | 2022-05-20 14:12:25,225 |
| %(msecs)s | 밀리초 부분 | 225.18444061279297 |
| %(thread)d | 스레드 ID | 8080 |
| %(threadName)s | 스레드 이름 | Thread-1 |
| %(process)d | 프로세스 ID | 12780 |
| %(message)s | 로그 메시지 | 정보 메시지 |