TIL/Django

[Django] Logging 설정

oraange 2022. 4. 26. 12:54

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 : 여기서 versiondictConfig 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/
 

django LOGGING 의 disable_existing_loggers 동작 방식에 대한 이해

django logging django는 python의 builtin 로깅 모듈을 사용하여 시스템 로깅 작업을 수행합니다. settings.py LOGGING을 통해 설정이 가능합니다. setting.py 에 LOGGING 설정이 없을 경우 아래 예시처럼 default 설정

ddangdol.github.io

 

Django(장고) 로깅 기초

장고 로깅현재 운영하고 있는 식단알리미의 사용자들이 어떠한 버튼을 누르는지 분석하기 위해 방법을 찾던 도중 사용자 입력에 대한 로그를 남기는 게 좋을 것 같아서 장고의 로깅하는 법에

jinmay.github.io

 

반응형