2008-10-26 3 views
160

따라서 개발시에는 settings.DEBUGTrue으로 설정하고 오류가 발생하면 좋은 스택 추적 및 요청 정보를 사용하여 멋지게 형식화 된 것을 볼 수 있습니다.어떻게 장고 사이트에 서버 오류를 기록합니까

그러나 생산 현장의 종류에 차라리 DEBUG=False와 쇼 방문자 나는이 순간에이 버그를 해결하고 있어요 정보를 몇 가지 표준 오류 500 페이지에서 사용하는 거라고 내가 원하는 동시에)
내 모든 파일 (스택 추적 및 요청 정보)을 내 서버의 파일에 로깅 할 수있는 방법이 있습니다. 따라서 콘솔로 출력하여 오류 스크롤을 보거나 매 시간마다 로그를 이메일로 보낼 수 있습니다.

장고 사이트의 로깅 솔루션은 간단한 요구 사항을 충족합니까? 나는 fcgi 서버로 실행중인 응용 프로그램을 가지고 있고 프론트 엔드로 아파치 웹 서버를 사용하고있다. (lighttpd에 가려고 생각하고있다.)

+0

뭔가 : 어쨌든, 첫 번째 것은 같은 파일에 표준 오류 리디렉션이 많은 도움 http://dlo.me/what-to-do-when-your-site-goes-viral/ – Cherian

+1

로그를 볼 수있는 보초 : http : //readthedocs.org/docs/sentry/en/latest/index.html – Cherian

답변

87

글쎄, DEBUG = False 일 때 Django는 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

하지 미들웨어 방법은 작업하기 매우 쉽다, 그래서 당신은, 그러나, 예외 객체에 액세스 할 수 없습니다.

+6

파이썬의 표준 로깅 모듈로'logging.exception ('Some message')'를 사용하면 'got_request_exception'에 대한 sginal 핸들러. 스택 추적을 로그 아웃하려는 경우에만 사용하십시오. 즉, 추적은'got_request_exception'에서 여전히 사용 가능합니다. –

+6

전자 메일 설정이 없다면 제대로 작동하지 않을 것입니다. – Alper

30

물론 제임스는 정확하지만 당신은 데이터 저장소에서 예외를 기록하기를 원한다면, 몇 가지 오픈 소스 솔루션은 이미 사용할 수 있습니다 : http://code.google.com/p/django-crashlog/

2) DB :

1) CrashLog은 좋은 선택이다 -Log는 좋은 선택입니다. http://code.google.com/p/django-db-log/

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

둘 다 사용했는데 제대로 작동합니다.

39

장고-DB는 로그, 다른 답변에서 언급으로 대체되었습니다

https://github.com/dcramer/django-sentry

+0

기록 : http://www.davidcramer.net/code/python/36302/keeping-your-logging-compatible-with-sentry.html –

+0

Thanks Tomoasz. http://blog.disqus.com/post/1178923988/django-sentry – tobych

72

장고 센트리는 이미 언급 한 바와 같이, 갈 수있는 좋은 방법이지만, 참여 작품의 비트가있다 제대로 설정하는 경우 (별도의 웹 사이트로).그냥 간단한 텍스트 파일에 모든 것을 기록하려면 여기 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 
     }, 
    }, 
} 
+0

도 동의합니다, 나는 Sentry를 좋아합니다! 나는 닷넷 포트를 갖고 싶다. (최근 닷넷 프로젝트에서 일하고있다.) – Gromer

+1

누구나 절단 & 붙여 넣기를하는 경우에 작은 오타가 있습니다. 끝에 "전파"대신 "전파하십시오". – user1228295

+0

감사! 오타가 수정되었습니다. – EMP

11

일부 시간에 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 
     }, 
    }, 
} 
+0

당신이 'disable_existing_loggers'를 가지고 있기 때문에 mail_admins 핸들러 (그리고 django.request logger)가 필요한지 궁금합니다 : False이고이 핸들러 (그리고 로거)로 기본 django 로깅을 단순히 복제하고 있습니다. 테스트를 마칠 때마다 업데이트하겠습니다. – DylanYoung

1

난 그냥 내 fcgi 스크립트 성가신 문제가 있었다 : 여기

는 수정 된 코드입니다. 그것은 장고가 시작되기 전에 발생했습니다. 로깅의 부족은 고통 스럽다. 전투 지상에서

#!/home/user/env/bin/python 
sys.stderr = open('/home/user/fcgi_errors', 'a') 
관련 문제