2011-05-04 6 views
17

을 사용하는 동안 Django에서 스택 추적을 표준 출력으로 출력합니다. 일부 검색을했는데 누군가 장고 구성의 스 니펫을 사용하여 장고를 표준 출력으로 출력하려면 궁금합니다. 그래서 터미널 창에서 볼 수 있습니다.) 요청 중에 오류가 발생했을 때. 이것은 특히 지역 개발/디버깅을위한 것이고 주로 AJAX 게시물 요청을 할 때 사용되며 Firebug에서 HTML을보고 오류가 발생한 행을 파악해야합니다.manage.py runserver

+0

"Terminal Window"? 'django-admin.py runserver'를 실행하고 있습니까? –

+0

네,'manage.py runserver'를 로컬로 사용하고 있지만, 이메일을 받는다해도 문제가되지는 않지만 생산에 도움이 될 것입니다. – Bialecki

+0

"프로덕션"접근 방식은 Apache와의 통합 방식에 따라 다르므로 해당 설정에 대한 자세한 내용을 제공하여 이해해야합니다. –

답변

20

이렇게하려면 미들웨어를 만들 수 있습니다.

class ExceptionLoggingMiddleware(object): 
    def process_exception(self, request, exception): 
     import traceback 
     print traceback.format_exc() 

놓고 장고 설정의 미들웨어 부분이 핸들러 : 여기가 프로젝트에 사용하고 수정 조각입니다.

0

서브 클래스 WSGI 핸들러는 정의 된 handle_uncaught_exception에서 원하는대로 추적을 수행하고, 배포 할 때 django가 제공하는 WSGIHandler 대신 WSGIHandler를 사용하십시오.

아파치/mod_wsgi에 함께 사용
import traceback 
from django.core.handlers.wsgi import WSGIHandler 

class MyWSGIHandler(WSGIHandler): 
    """WSGI Handler which prints traceback to stderr""" 
    def handle_uncaught_exception(self, request, resolver, exc_info): 
     traceback.print_tb(exc_info[2], file=sys.stderr) 
     return super(WSGIHandler, self).handle_uncaught_exception(request, resolver, exc_info) 

이 아파치의 에러 로그

24

또 다른 방법은 LOGGING 함께에서 역 추적을 작성해야합니다.

LOGGING = { 
    'version': 1, 
    'handlers': { 
     'console':{ 
      'level':'DEBUG', 
      'class':'logging.StreamHandler', 
     }, 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers':['console'], 
      'propagate': True, 
      'level':'DEBUG', 
     } 
    }, 
} 

이 구문은 장고 문서 Configuring Logging에서오고 더 높이거나는 console의 양을 감소 수정할 수 있습니다하여 settings.py 파일에 다음을 추가하여 ./manage.py runserver을 실행할 때 특히 당신은 스택 트레이스를 얻을 수 벌채 반출.

또한 5XX 응답은 오류 메시지로 제기되고 4XX 응답은 경고 메시지로 발생합니다.

이 질문에 & 답변은 2013 년 중복 here입니다.

+3

제 생각에는 이것이 바람직한 방법이어야합니다. 어떤 로거를 사용하고 싶은지, 어떤 것을 기록하고 싶은지 등을 훨씬 더 많이 제어 할 수 있습니다. – Andre

0

비슷한 문제가 있었지만 미들웨어 옵션이 도움이되지 않았습니다. 그 이유는 django-jsonview 0.4.3을 사용했기 때문입니다. 데코레이터가 장식 된 함수가 실패하더라도 사전을 유효한 json http 응답으로 변환하는 데코레이터를 제공하므로 process_exception 미들웨어 메소드가 호출되지 않습니다. 나는이 장식의 코드를 확인하고 이렇게 오류 로그인을 시도 할 것으로 보인다 :이 작동하지 않으며 아무것도 내 bash는 콘솔에 기록되는 이유,

... 
except Exception as e: 
    logger = logging.getLogger('django.request') 
    logger.exception(unicode(e)) 

는 그러나, 나는 모르겠어요. 왜 이런 일이 일어나는지 알아야합니다. 내 모든 JSON보기에, 그리고

def log_errors(func): 
    if not settings.DEBUG: 
     return func 

    def wrapper(request, *args, **kwargs): 
     try: 
      return func(request, *args, **kwargs) 
     except: 
      print traceback.format_exc() 
    return wrapper 

: 한편, 나는 여분의 장식을 사용하고

@json_view 
@log_errors 
def my_view(request): 
    .... 
1

나는 보통이 사용 : 다음

except Exception,e: 
     # Get line 
     trace=traceback.extract_tb(sys.exc_info()[2]) 
     # Add the event to the log 
     output ="Error in the server: %s.\n" % (e) 
     output+="\tTraceback is:\n" 
     for (file,linenumber,affected,line) in trace: 
      output+="\t> Error at function %s\n" % (affected) 
      output+="\t At: %s:%s\n" % (file,linenumber) 
      output+="\t Source: %s\n" % (line) 
     output+="\t> Exception: %s\n" % (e) 

내가 사용 "을 출력 "내가 원하는 것 : 표준 출력으로 인쇄, 이메일 보내기 등 ...

11

It 's st 범위 아무도 DEBUG_PROPAGATE_EXCEPTIONS 설정을 언급하지 않았습니다.프로덕션이 아니지만 테스트/디버깅 환경에서 사용하기가 쉽습니다. settings.py에 간단히 덧붙여서 :

DEBUG_PROPAGATE_EXCEPTIONS = True 
+1

정확하게 대답하는 것이 가장 적절합니다 :) – sudhanshu

+0

+1은 가치가 있으며, 몇 시간 후에 DRF 문제를 디버깅 한 후 더 많은 테스트/옵션을 사용해보십시오. 문자 그대로 내 하루를 저장했습니다 ... – jliendo

+0

이것은 분명히 받아 들여진 대답이어야합니다, 정말 고마워요! –

관련 문제