2011-05-04 74 views
17

我做了一些搜索,但我想知道是否有人有一個日誌記錄配置的片段來讓Django只輸出堆棧跟蹤到stdout(所以我可以在終端窗口中看到它),當它在請求期間遇到錯誤。這是專門爲本地開發/調試,主要用於當我做AJAX發佈請求時,我不得不看看Firebug中的HTML來找出發生錯誤的行。在使用manage.py運行服務器時在Django中輸出堆棧跟蹤到stdout

+0

「Terminal Window」?你正在運行'django-admin.py runserver'? – 2011-05-04 15:56:05

+0

是的,'manage.py runserver'在本地,但是這對生產也是有幫助的,儘管我收到了郵件,所以沒有問題。 – Bialecki 2011-05-04 16:05:37

+0

「生產」方法取決於您如何與Apache集成,因此您需要提供有關該配置的更多細節以確保我們理解。 – 2011-05-04 16:08:42

回答

20

您可以創建一箇中間件來執行此操作。這裏有一個修改的摘錄我使用的一個項目:

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

將這個處理程序中的Django的設置,您的中間件的一部分。

0

子類WSGI處理程序,根據您定義的handle_uncaught_exception中的回溯執行任何操作,並在部署時使用WSGIHandler而不是由django提供的。

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) 

使用的Apache/mod_wsgi的,應在Apache的錯誤日誌

24

另一種方法是用測井寫回溯。

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

這句法來自Django文檔Configuring Logging,並且可以進一步修改以增加或減少控制檯 - 量:具體來說,你通過添加以下到settings.py文件運行時./manage.py runserver得到一個堆棧跟蹤日誌記錄。

另外,5XX響應被升高爲錯誤消息和4XX響應升高作爲警告消息。

請注意,這個問題&答案有2013重複here

+3

這應該是我認爲的首選方法。你有更多的控制權,你想使用什麼記錄器,你想記錄什麼等。 – Andre 2014-05-27 03:10:09

0

我有類似的問題,但中間件選項並沒有幫助我。原因是我使用的是django-jsonview 0.4.3,它提供了一個裝飾器,可以將字典轉換爲有效的json http響應,即使裝飾函數失敗,也不會調用process_exception中間件方法。我檢查這個裝飾的代碼和它似乎試圖登錄錯誤這樣做:

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

不過,我不知道爲什麼,這是行不通的,並沒有什麼記錄在我的bash控制檯。我應該找出爲什麼會發生這種情況。同時,我使用一個額外的裝飾:

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的觀點:

@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

這是st範圍內沒有人提到DEBUG_PROPAGATE_EXCEPTIONS設置。它不是用於生產,而是在測試/調試環境中使用非常簡單。只需添加到settings.py

DEBUG_PROPAGATE_EXCEPTIONS = True 
+1

確切地說,這似乎是最合適的答案:) – sudhanshu 2016-02-28 11:23:39

+0

對於什麼是值得的+1,經過幾個小時調試DRF問題並且沒有更多的測試/選項來嘗試,你真的救了我的一天... – jliendo 2016-04-03 15:19:04

+0

這絕對應該是接受的答案,非常感謝你! – 2016-06-07 17:29:14

相關問題