2016-05-30 74 views
2

我試圖用django.request記錄器記錄所有4xx和5xx響應,但是這隻有在引發異常或URL中的URL不匹配。`django.request`記錄器沒有記錄來自視圖的4xx和5xx響應

settings.py如下:

import logging.config 

LOGGING_CONFIG = None 

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'handlers': { 
     'console': { 
      'level': 'DEBUG', 
      'class': 'logging.StreamHandler', 
     }, 
     'logfile': { 
      'level': 'DEBUG', 
      'class': 'logging.handlers.RotatingFileHandler', 
      'filename': "logfile", 
      'maxBytes': 50000, 
      'backupCount': 2, 
     }, 
    }, 
    'loggers': { 
     'django.request': { 
      'handlers': ['logfile'], 
      'level': 'WARNING', 
      'propagate': True, 
     } 
    }, 
} 
logging.config.dictConfig(LOGGING) 

如果我有它返回一個像這樣的4XX或5XX狀態的觀點:

def test500(request): 
    return HttpResponse("error", status=500) 

然後沒有被記錄。但是,如果我的觀點提出了這樣一個異常,那麼一個異常被正確記錄:

def testcrash(request): 
    print 1/0 # server will respond with 500 

這是django.request記錄器的預期的行爲?記錄我的視圖返回的5xx和4xx響應的最佳方式是什麼?

回答

3

前段時間我自己遇到了這個問題。這是發生了什麼:如果是未捕獲的異常的結果

  • 500錯誤僅記錄。如果您手動設置500狀態,則不會被記錄。這裏是relevant part of the code--正如你所看到的那樣,日誌記錄發生在handle_uncaught_exception方法中。

  • 404響應的行爲當前是相同的 - 只有未被捕獲的Http404響應被記錄。 但是,這在Django 1.10中已經改變。看我的comment on this ticket

    我只是想指出,這個改變已經改變了Django的404日誌記錄的行爲有點。

    以前,如果Http404異常冒泡到核心處理程序(並且如果視圖/中間件發現異常並返回響應,而不管該響應是否仍是404),Django將只記錄404。

    現在,它將記錄所有404響應,無論它們是如何生成的。這對我來說似乎更好,但可能有依賴於以前行爲的應用程序。

    所以從Django 1.10開始,所有的404響應都會被記錄下來。這對我來說似乎有點不一致。

  • 其他4xx只有在引發相應異常時纔會記錄響應。 400異常記錄到django.security而不是django.request.

爲了回答您的其他問題 - 什麼是不斷記錄這些東西的最佳方式? - 我發現的最可靠的方法是編寫自己的中間件,它檢查所有響應的狀態並進行自己的日誌記錄。

編輯:我created a ticket試圖解決Django中的這些不一致之處。

-1

如果你只需要看到的錯誤,您正在使用apache2.4服務器,你可以在/var/log/apache2/error.log找到它

訪問日誌,可以發現在/ var/log/apache2/access.log