2013-10-10 21 views
6

Z DEBUG = True, Django wyjątki zrzutu do stderr, który jest zwykle wysyłany do rotacyjnego pliku dziennika przez serwer sieciowy.Z DEBUG = False, jak mogę logować wyjątki django do pliku dziennika

Z DEBUG = False, Django zamiast tego wysyła wiadomość e-mail do wyjątku ADMINS =.

Jak mogę zachować DEBUG = Prawdziwe zachowanie przy DEBUG = Fałsz?

Przeczytałem How do you log server errors on django sites i How can I see error logs of Django views i How do you log server errors on django sites. Odpowiedź wydaje się obejmować niektóre oprogramowanie pośrednie. Czy jest dostępny fragment kodu, czy też zawierają te baterie?

Odpowiedz

6

Oto pełna funkcjonalna konfiguracja rejestrowania. Błędy krytyczne są rejestrowane na posterunku, ostrzeżenia są wysyłane do administratorów przez e-maile, zwykłe błędy zawiadomienia są rejestrowane w syslog, a komunikaty debugowania są monitowane na standardowe wyjście.

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

Czy jest gdzieś opcja rejestratora stderr? – Bryce

+0

Domyślnym wyjściem dla klasy [logging.StreamHandler] (http://docs.python.org/2/library/logging.handlers.html#streamhandler) jest stderr. –

+0

Więc jeśli sprawdziłem propagować do True, otrzymam DEBUG = Prawdziwe zachowanie logowania przez Apache? – Bryce

3

Django wykorzystuje filtr rejestrowania decydowania więdną handler console jest używany lub nie domyślnie. Zobacz także django.utils.log on Github.

Aby utrzymać takie samo zachowanie bez filtrowania wiadomości do konsoli, filtrowanie po prostu wyłączyć w swojej settings.py tak:

from django.utils.log import DEFAULT_LOGGING 

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

Krótkie i słodkie, wielkie dzięki za udostępnienie! – mrts

0

Oto kolejny sposób to zrobić ze złożoności połowie drogi między innymi odpowiedziami, loguje zarówno do konsola i plik

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