2013-10-10 4 views
6

Mit DEBUG = True Django Ausnahmen dump zu Stderr, die in der Regel eine rotierende Protokolldatei vom Webserver gesendet wird.Mit DEBUG = False, wie kann ich Django-Ausnahmen in eine Protokolldatei protokollieren

Mit DEBUG = False sendet Django stattdessen die Ausnahme an die ADMINS =.

Wie kann ich das DEBUG = True-Verhalten mit DEBUG = False beibehalten?

Ich habe gelesen How do you log server errors on django sites und How can I see error logs of Django views und How do you log server errors on django sites. Die Antwort scheint etwas Middleware zu beinhalten. Gibt es einen Code-Schnipsel oder sind diese Batterien enthalten?

Antwort

6

Hier ist eine vollständig funktionierende Protokollierungskonfiguration. Kritische Fehler werden in Sentry protokolliert, Warnungen werden per E-Mail an Administratoren gesendet, normale Benachrichtigungsfehler werden in Syslog protokolliert und Debug-Meldungen werden auf der Standardausgabe ausgegeben.

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

Gibt es irgendwo eine Stoderr-Logger-Option? – Bryce

+0

Die [logging.StreamHandler-Klasse] (http://docs.python.org/2/library/logging.handlers.html#streamhandler) Standardausgabe ist stderr. –

+0

Also, wenn ich überprüft, propagieren auf True, würde ich das DEBUG = True Verhalten der Protokollierung über Apache? – Bryce

3

Django verwendet eine Protokollfilter zu entscheiden, welken die console Handler verwendet wird oder nicht standardmäßig aktiviert. Siehe auch django.utils.log on Github.

das gleiche Verhalten zu halten, ohne Nachrichten Filterung nur deaktivieren Filterung in Ihrem settings.py wie diese zu trösten:

from django.utils.log import DEFAULT_LOGGING 

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

Kurz und gut, vielen Dank für das Teilen! – mrts

0

Hier ist ein weiterer Weg, um es mit Komplexität auf halbem Weg zwischen den anderen Antworten zu tun, meldet sich sowohl auf Konsole und Datei

# 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'), 
     }, 
    }, 
} 
Verwandte Themen