Django 사이트에서 서버 오류를 기록하는 방법


175

따라서 개발을 할 때 설정할 settings.DEBUGTrue있으며 오류가 발생하면 스택 추적 및 요청 정보가 좋은 형식으로 볼 수 있습니다.

그러나 일종의 생산 사이트에서 나는 현재이 DEBUG=False버그를 수정하기 위해 노력하고 있다는 정보가있는 표준 오류 500 페이지를 사용 하고 방문자에게 보여주고 싶습니다 .)
동시에 모든 로깅 방법을 원합니다. 해당 정보 (스택 추적 및 요청 정보)를 서버의 파일에 저장하면 콘솔로 출력하여 오류 스크롤을 볼 수 있으며 매 시간마다 로그를 전자 메일로 보낼 수 있습니다.

django-site를 위해 어떤 로깅 솔루션을 추천하고 그러한 간단한 요구 사항을 충족합니까? 응용 프로그램을 fcgi서버로 실행하고 있으며 아파치 웹 서버를 프론트 엔드로 사용하고 있습니다 (lighttpd로 갈 생각이지만).



2
로그를 보려는 센트리 : readthedocs.org/docs/sentry/en/latest/index.html
Cherian

Cherian이 공유 한 링크는 이제 죽었습니다. Sentry를 검색하려고하면 유료 공식 인스턴스에 대한 자료를 찾을 가능성이 있지만 자체 호스팅 인스턴스를 설정하기위한 링크는 다음과 같습니다. docs.sentry.io/server 또한 현재 유지 관리되는 repo : github .com / getsentry / sentry
lehiester

답변:


103

글쎄, DEBUG = FalseDjango는 ADMINS설정에 나열된 각 사람에게 오류의 전체 추적을 자동으로 메일로 보내 므로 거의 무료로 알림을받을 수 있습니다. 보다 세밀한 제어를 원하면라는 메소드를 정의하는 미들웨어 클래스를 작성하여 설정에 추가 할 수 있습니다.이 메소드 process_exception()는 발생한 예외에 액세스 할 수 있습니다.

http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-exception

그러면 process_exception()메소드는 콘솔에 쓰기, 파일에 쓰기 등 원하는 로깅 유형을 수행 할 수 있습니다.

편집 : 약간 유용하지는 않지만 got_request_exception요청 처리 중에 예외가 발생할 때마다 전송되는 신호를 수신 할 수도 있습니다.

http://docs.djangoproject.com/en/dev/ref/signals/#got-request-exception

이것은 않습니다 하지 미들웨어 방법으로 작업을 훨씬 더 쉽게 있도록하지만, 예외 객체에 대한 액세스를 제공합니다.


7
logging.exception('Some message')python의 표준 로깅 모듈과 함께 사용 하면 스택 핸들러를 got_request_exception로그 아웃 하는 것만으로 sginal handler에서 제대로 작동 합니다. 다시 말해, 추적은 여전히에서 사용할 수 있습니다 got_request_exception.
TM.

process_exception에 전달 된 예외에 스택 추적이없는 것 같습니다.이를 얻을 수있는 방법이 있습니까?
Nick BL

79

Django Sentry는 이미 언급했듯이 좋은 방법이지만, 별도의 웹 사이트로 올바르게 설정하는 데 약간의 작업이 있습니다. 간단한 텍스트 파일에 모든 것을 기록하려면 여기에 기록 할 로깅 구성이 있습니다.settings.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/var/log/django/myapp.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'WARNING', # Or maybe INFO or DEBUG
            'propagate': False
        },
    },
}

동의합니다. Sentry를 좋아합니다! .Net 포트가 필요합니다 (최근 .Net 프로젝트에서 작업 중임).
Gromer

1
누군가가 잘라내어 붙여 넣을 경우를 대비 한 작은 오타 : 끝에 "전파"대신 "프로 포 게이트".
user1228295 2016 년

3
'include_html': True단순히 전자 메일을 "더 이상"으로 만들지 않습니다! 설정 값과 로컬 변수를 포함한 전체 역 추적을 포함합니다. docs.djangoproject.com/en/1.8/topics/logging/…
Thomas

1
'disable_existing_loggers': False이므로 mail_admins 핸들러 (및 django.request 로거)가 필요한지 궁금합니다.이 핸들러 (및 로거)를 사용하여 기본 django 로깅을 복제하고 있습니다. 테스트하면 업데이트됩니다.
DylanYoung

이 답변을 업데이트하십시오. django1.9 change-log에서 : Django의 기본 로깅 구성은 더 이상 'django.request'및 'django.security'로거를 정의하지 않습니다.
narendra-choudhary


30

분명히 James는 정확하지만 데이터 저장소에 예외를 기록하려는 경우 이미 사용 가능한 몇 가지 오픈 소스 솔루션이 있습니다.

1) CrashLog는 http://code.google.com/p/django-crashlog/를 선택하는 것이 좋습니다 .

2) Db-Log도 좋은 선택입니다. http://code.google.com/p/django-db-log/

둘의 차이점은 무엇입니까? 내가 볼 수있는 거의 아무것도 없으므로 어느 쪽이든 충분합니다.

나는 두 가지를 모두 사용했으며 잘 작동합니다.


15

EMP의 가장 유용한 코드 제출 이후로 시간이 지났습니다. 방금 그것을 구현했고, 버그를 추적하기 위해 일부 manage.py 옵션을 사용하여 문제를 해결하는 동안 현재 버전의 Django (1.5.?)에서 require_debug_false 필터가 있다는 효과에 대한 사용 중단 경고가 나타납니다. mail_admins 핸들러에 필요합니다.

수정 된 코드는 다음과 같습니다.

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
         'require_debug_false': {
             '()': 'django.utils.log.RequireDebugFalse'
         }
     },
    'handlers': {
        # Include the default Django email handler for errors
        # This is what you'd get without configuring logging at all.
        'mail_admins': {
            'class': 'django.utils.log.AdminEmailHandler',
            'level': 'ERROR',
            'filters': ['require_debug_false'],
             # But the emails are plain text by default - HTML is nicer
            'include_html': True,
        },
        # Log to a text file that can be rotated by logrotate
        'logfile': {
            'class': 'logging.handlers.WatchedFileHandler',
            'filename': '/home/username/public_html/djangoprojectname/logfilename.log'
        },
    },
    'loggers': {
        # Again, default Django configuration to email unhandled exceptions
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },
        # Might as well log any errors anywhere else in Django
        'django': {
            'handlers': ['logfile'],
            'level': 'ERROR',
            'propagate': False,
        },
        # Your own app - this assumes all your logger names start with "myapp."
        'myapp': {
            'handlers': ['logfile'],
            'level': 'DEBUG', # Or maybe INFO or WARNING
            'propagate': False
        },
    },
}

'disable_existing_loggers': False이므로 mail_admins 핸들러 (및 django.request 로거)가 필요한지 궁금합니다.이 핸들러 (및 로거)를 사용하여 기본 django 로깅을 복제하고 있습니다. 테스트하면 업데이트됩니다.
DylanYoung

1

방금 fcgi스크립트에 성가신 문제가있었습니다 . 장고가 시작되기 전에 발생했습니다. 벌목 부족은 너무 고통 스럽습니다. 어쨌든 stderr를 파일로 리디렉션하는 것이 가장 도움이되었습니다.

#!/home/user/env/bin/python
sys.stderr = open('/home/user/fcgi_errors', 'a')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.