Django의 일반적인 디버그 방법 요약

4739 단어
자주 사용하는 디버그 방식은 두 가지가 있는데 일반적으로 우리는 print 함수로 컨트롤러에 인쇄하는 것에 익숙하다. 또한 Django도 logging 모듈을 제공했다. 다음은 다음과 같은 두 가지 방식의 사용 방법을 하나하나 소개한다.
1. print 방법
python 관리자를 사용하기 때문입니다.py runserver는 실제적으로 하위 프로세스를 시작하는 방식으로 하위 프로세스의 표준 출력이 어디에 있는지 알 수 없기 때문에 디버그 서버만 하위 프로세스로 진행하지 못하게 하고 다음과 같은 명령을 사용할 수 있습니다.
python manage.py runserver --noreload

이렇게 print에서 나온 정보는 터미널에서 볼 수 있지만, 이렇게 조작하는 문제는 코드가 수정될 때마다 서버를 다시 시작해야 한다는 것이다.
2. Django loging 모듈 사용
# -*- coding:utf-8 -*-
import logging
# Get an instance of a logger
logger = logging.getLogger(__name__)
logger.debug('debug message') 
logger.info('info message') 
logger.warn('warn message') 
logger.error('error message') 
logger.critical('critical message')

기본적으로 logging 모듈은 로그를 화면에 출력합니다 (stdout). 로그 레벨은 WARNING입니다. (로그 레벨이 WARNING보다 높은 로그 정보만 출력됩니다.)
setting에서.py에서 구성 로그:
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/path/to/django/debug.log',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

복잡한 로그 구성:
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'filters': {
        'special': {
            '()': 'project.logging.SpecialFilter',
            'foo': 'bar',
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {
        'console': {
            'level': 'INFO',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'mail_admins': {
            'level': 'ERROR',
            'class': 'django.utils.log.AdminEmailHandler',
            'filters': ['special']
        }
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'propagate': True,
        },
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': False,
        },
        'myproject.custom': {
            'handlers': ['console', 'mail_admins'],
            'level': 'INFO',
            'filters': ['special']
        }
    }
}

logging 모듈의 몇 가지 중요한 개념, Logger,Handler,Formatter,Filter:
  • Logger 레코더는 애플리케이션 코드가 직접 사용할 수 있는 인터페이스를 노출합니다.
  • Handler 프로세서로 로그 기록을 적당한 목적지로 보냅니다.
  • Filter 필터는 출력할 로그 기록을 결정하는 더 나은 입도 제어를 제공합니다.
  • Formatter 포맷기는 최종 출력의 로깅 레이아웃을 나타냅니다.

  • logging 모듈의 처리 프로세스
  • 로그의 등급이 Logger 대상의 등급보다 큰지 판단하고, 크면 아래로 실행하고, 그렇지 않으면 절차가 끝납니다.
  • 로그가 생성됩니다.첫 번째 단계는 이상 여부를 판단하고 이상이 있으면 이상 정보를 추가한다.두 번째 단계는 로그 기록 방법 (예: debug, info 등) 의 자리 차지 문자, 즉 일반적인 문자열 포맷 처리를 처리합니다.
  • Logger 객체에 등록된 Filters를 사용하여 필터링합니다.필터가 여러 개 있으면 순서대로 필터하기;필터가 가짜를 되돌려주면 필터가 끝나고 로그 정보는 버려지고 처리되지 않으며 처리 절차도 여기서 끝납니다.그렇지 않으면 처리 절차가 아래로 실행됩니다.
  • 현재 Logger 대상에서Handlers를 찾습니다. 만약Handler를 찾지 못하면 이 Logger 대상의 아버지 Logger에서 찾습니다.하나 이상의Handler를 찾으면 로그 정보를 순서대로Handler로 처리합니다.그러나 각각의 Handler가 로그 정보를 처리하는 과정에서 로그 정보의 등급이 이Handler의 등급보다 큰지 먼저 판단하고, 크면 아래로 실행(Logger 대상에서 Handler 대상에 들어가는 것)하고, 그렇지 않으면 처리 절차가 끝난다.
  • Handler 대상에 등록된 Filter 방법을 순서대로 실행합니다.만약 Filter가 이 로그 정보를 가짜로 판단한다면, 이후의 모든 Filter는 더 이상 실행하지 않고, 이 로그 정보를 버리고 처리 절차가 끝납니다.
  • Formatter 클래스를 사용하여 최종 출력 결과를 포맷합니다.참고: Formatter는 위의 2단계 문자열 포맷과 달리 로그가 생성된 시간, 로그가 생성된 원본 코드가 있는 원본 파일의 경로 등 추가 정보를 추가합니다.
  • 로그 정보(네트워크, 파일, 단말기, 메일 등)를 진정으로 출력한다.어느 목적지로 출력할지는 핸들러의 종류에 따라 결정된다.

  • 자세한 사용 방법은 공식 문서를 볼 수 있습니다.https://docs.djangoproject.com/en/1.7/topics/logging/
    전재 대상:https://www.cnblogs.com/weisenz/archive/2012/04/01/2428576.html

    좋은 웹페이지 즐겨찾기