2013-10-10 26 views
6

使用DEBUG = True時,Django例外會轉儲到stderr,這通常由Web服務器發送到循環日誌文件。使用DEBUG = False時,如何將django例外記錄到日誌文件

在DEBUG = False時,Django會將異常通過電子郵件發送給ADMINS =。

如何保留DEBUG = True行爲與DEBUG = False?

我讀過How do you log server errors on django sitesHow can I see error logs of Django viewsHow do you log server errors on django sites。答案似乎涉及一些中間件。是否有可用的代碼片段,還是包含這些電池?

回答

6

這裏是一個完整的工作日誌配置。嚴重錯誤記錄到哨兵,警告通過電子郵件發送給管理員,正常通知錯誤記錄到系統日誌,並在標準輸出上提示調試消息。

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'filters': { 
     'require_debug_false': { 
      '()': 'django.utils.log.RequireDebugFalse' 
     } 
    }, 
    'formatters': { 
     'verbose': { 
      'format': '[contactor] %(levelname)s %(asctime)s %(message)s' 
     }, 
    }, 
    'handlers': { 
     # Send all messages to console 
     'console': { 
      'level': 'DEBUG', 
      'class': 'logging.StreamHandler', 
     }, 
     # Send info messages to syslog 
     'syslog':{ 
      'level':'INFO', 
      'class': 'logging.handlers.SysLogHandler', 
      'facility': SysLogHandler.LOG_LOCAL2, 
      'address': '/dev/log', 
      'formatter': 'verbose', 
     }, 
     # Warning messages are sent to admin emails 
     'mail_admins': { 
      'level': 'WARNING', 
      'filters': ['require_debug_false'], 
      'class': 'django.utils.log.AdminEmailHandler', 
     }, 
     # critical errors are logged to sentry 
     'sentry': { 
      'level': 'ERROR', 
      'filters': ['require_debug_false'], 
      'class': 'raven.contrib.django.handlers.SentryHandler', 
     }, 
    }, 
    'loggers': { 
     # This is the "catch all" logger 
     '': { 
      'handlers': ['console', 'syslog', 'mail_admins', 'sentry'], 
      'level': 'DEBUG', 
      'propagate': False, 
     }, 
    } 
} 
+0

在那裏有stderr記錄器選項嗎? – Bryce

+0

[logging.StreamHandler類](http://docs.python.org/2/library/logging.handlers.html#streamhandler)默認輸出是stderr。 –

+0

所以,如果我檢查傳播到True,我會得到通過Apache日誌DEBUG =真的行爲? – Bryce

3

Django使用一個日誌過濾器來決定枯萎console處理器默認使用與否。另見django.utils.log on Github

要保持相同的行爲,而過濾消息安慰,只是禁用篩選在settings.py這樣的:

from django.utils.log import DEFAULT_LOGGING 

DEFAULT_LOGGING['handlers']['console']['filters'] = [] 
+0

簡短又甜蜜,非常感謝分享! – mrts

0

下面是與其他的答案之間的複雜中途做的另一種方式,都記錄到控制檯和文件

# settings.py 
LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'handlers': { 
     'console': { 
      'class': 'logging.StreamHandler', 
     }, 
     'file': { 
      'level': 'DEBUG', 
      'class': 'logging.FileHandler', 
      'filename': 'log.django', 
     }, 
    }, 
    'loggers': { 
     'django': { 
      'handlers': ['console','file'], 
      'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'), 
     }, 
    }, 
} 
相關問題