[Django] Logging 설정
2022. 4. 26. 12:54ㆍTIL/Django
django에서의 logging
python 유저들이 프로그래밍을 할 때 대부분 print 함수를 사용해서 디버깅을 할 것이다.
왜냐면 가장 간단하고 편하기 때문에...
그러나 logging을 이용하면 더 구조적이고 관리하기 쉬운 디버깅이 가능하다.
logging level
로깅의 레벨은 총 5가지 단계가 있다.
- DEBUG : Low level system information for debugging purposes
- 말 그대로 디버깅 용도이다. 변수에 할당된 값이 무엇인지 확인하는 정도...?
- INFO : General system information
- 일반적으로 찍히는 로그이다. 유저의 로그인 기록, 파일 업로드 기록 등
- django에서는 default값으로 사용한다.
- WARNING : Information describing a minor problem that has occurred.
- 문제점 중에서 우선순위가 낮거나 서버에 영향이 가지 않는 정도의 정보이다.
- "보안적으로 문제가 될 수 있지만 서버 돌리는건 문제 없으니 너 알아서 해" 와 비슷한 느낌
- ERROR : Information describing a major problem that has occurred.
- 문제점 중에서 중요한 문제가 발생한 경우이다.
- 얘기 안해도 알 수 있듯이 평소에 콘솔창(혹은 터미널)에서 자주 접하는 지렁이들
- CRITICAL : Information describing a critical problem that has occurred.
- 치명적인 문제점 발생 시 이에 대한 정보
- 최상위 수준의 로그이다.
logging settings
로깅을 시작해 보자.
먼저 프로젝트 파일의 settings.py
또는 settings/base.py
에다가 다음과 같은 코드를 추가해 주자.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'formatters': {
'django.server': {
'()': 'django.utils.log.ServerFormatter',
'format': '[{server_time}] {message}',
'style': '{',
},
'standard': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
},
},
'handlers': {
'console': {
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
},
'django.server': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'django.server',
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
},
'file': {
'level': 'INFO',
'encoding': 'utf-8',
'filters': ['require_debug_false'],
'class': 'logging.handlers.RotatingFileHandler',
'filename': BASE_DIR / 'logs/mysite.log',
'maxBytes': 1024*1024*5, # 5 MB
'backupCount': 5,
'formatter': 'standard',
},
},
'loggers': {
'django': {
'handlers': ['console', 'mail_admins', 'file'],
'level': 'INFO',
},
'django.server': {
'handlers': ['django.server'],
'level': 'INFO',
'propagate': False,
},
'my': {
'handlers': ['console', 'file'],
'level': 'INFO',
},
}
}
- version : 여기서
version
은 dictConfig version 이라는 뜻인데, 현재 1밖에 존재하지 않다고 한다. 그냥 1이라고 적어주자.
- disable_existing_loggers :
True
로 설정될 경우 해당LOGGING
설정이 적용될 때 이미 존재하는 로거들을 비활성화한다.- gunicorn같은 WSGI서버들의 로깅 설정에 영향을 줄 수 있다.
- 자세한건 https://ddangdol.github.io/disable-existing-loggers-for-django/#2021 여기를 참고하면 된다. 설명이 잘 되어있다.
- 어쨋거나 웬만하면
False
로 설정하는 것이 좋다. 그러나 모든 경우에서 그런 것은 아니므로 어떻게 동작하는지 잘 숙지하고 때에 맞게 변경하면 될 것이다.
- filters : 로그 레코드가 로거에서 핸들러로 넘어갈 때, 필터를 사용해서 로그 레코드에 부가적인 제어를 가능하게 한다. 여기서 사용한 필터는 DEBUG 모드일 때와 아닐 때의 필터를 추가해 주었다.
- formatter : 로그 데이터를 텍스트로 렌더링할 형식을 지정해 준다.
- handlers : 로거에 저장된 메세지에 대해 어떠한 작업을 할지 결정해 준다. `console`로 출력할 수도 있고, `file`로 저장할 수도 있다. 핸들러도 로거와 마찬가지로 로그 레벨을 갖는다. 로그 레코드의 로그 레벨이 핸들러의 로그 레벨보다 더 낮으면 핸들러는 메세지를 무시하게 된다.
- loggers : 로거를 정의한다. 로거는 로깅 시스템의 시작점으로 로그 메시지를 처리하기 위해 메시지를 담아두는 곳이다. runserver를 통해 서버 포트를 오픈할 경우 `django.server`가 디폴트 로거가 되고 gunicorn같은 WSGI를 사용하여 배포할 경우에는 그보다 더 상위에 있는 `django`가 디폴트 로거로 설정된다. 그 아래에 있는 `my`는 자신이 원하는 로거를 만들 수 있다.
import logging
logger = logging.getLogger('my')
참고
https://ddangdol.github.io/disable-existing-loggers-for-django/#2021
https://jinmay.github.io/2018/06/18/django/how-to-log-django/
반응형
'TIL > Django' 카테고리의 다른 글
[Django] connection.queries always empty (0) | 2022.10.13 |
---|---|
[Django] DRF란? (0) | 2022.10.12 |
[Django] pending되는 이슈에 대한 고찰 (0) | 2022.08.02 |
[Django] Logging Handler (0) | 2022.04.28 |
[Django] timezone (0) | 2022.04.15 |