Wiem, że to już rozwiązana odpowiedź, ale zgodnie z django> = 1.3 jest nowe ustawienie rejestrowania.
Przeprowadzka ze starego na nowy nie jest automatyczna, więc pomyślałem, że zapiszę to tutaj.
I oczywiście kasy the django doc po więcej.
Jest to podstawowa conf, domyślnie tworzone z django-admin createproject v1.3 - przebieg może się zmienić z najnowszych wersji django:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
}
}
}
Struktura ta bazuje na standardowym Python logging dictConfig, że narzuca następujące bloki:
formatters
- odpowiednia wartość będzie DICT, w której każdy klawisz jest id formater i każda wartość jest DICT opisujący jak skonfigurować odpowiednią instancję formatyzatora.
filters
- odpowiednia wartość będzie dict, w którym każdy klucz jest identyfikatorem filtra, a każda wartość jest dyktando opisujące, jak skonfigurować odpowiednią instancję Filter.
handlers
- odpowiednią wartością będzie dyktat, w którym każdy klucz jest identyfikatorem osoby obsługującej, a każda wartość jest dict opisującym, jak skonfigurować odpowiednią instancję Handler. Każdy handler ma następujące klucze:
class
(obowiązkowe). Jest to w pełni kwalifikowana nazwa klasy obsługi.
level
(opcjonalnie). Poziom obsługi.
formatter
(opcjonalnie). Identyfikator formatyzatora dla tego programu obsługi.
filters
(opcjonalnie). Lista identyfikatorów filtrów dla tego programu obsługi.
zwykle zrobić przynajmniej to:
- dodać plik .log
- skonfigurować swoje aplikacje, by napisać do tego dziennika
co przekłada się na:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'null': {
'level':'DEBUG',
'class':'django.utils.log.NullHandler',
},
'console':{
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
# I always add this handler to facilitate separating loggings
'log_file':{
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(VAR_ROOT, 'logs/django.log'),
'maxBytes': '16777216', # 16megabytes
'formatter': 'verbose'
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
'apps': { # I keep all my of apps under 'apps' folder, but you can also add them one by one, and this depends on how your virtualenv/paths are set
'handlers': ['log_file'],
'level': 'INFO',
'propagate': True,
},
},
# you can also shortcut 'loggers' and just configure logging for EVERYTHING at once
'root': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO'
},
}
edit
Zobacz request exceptions are now always logged i Ticket #16288:
zaktualizowałem powyższy przykładowy conf jawnie zawierać poprawną filtr dla mail_admins tak, że domyślnie, e-maile nie są wysyłane podczas debugowania jest prawda.
Należy dodać filtr:
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
i zastosować go do obsługi mail_admins:
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
Inaczej django.core.handers.base.handle_uncaught_exception
nie przechodzi do 'błędów' django.request rejestratorze Jeśli ustawienia .DEBUG jest prawdziwe.
Jeśli nie to zrobić w Django 1.5 dostaniesz
DeprecationWarning: Nie masz filtry zdefiniowane na rejestrowanie obsługi do „mail_admins”: dodawanie niejawna debug-fałszywie tylko filtrować
ale rzeczy nadal będą działały poprawnie ZARÓWNO w django 1.4 i django 1.5.
** edit koniec **
To conf jest silnie inspirowana konf próbki w doc django, ale dodając część pliku dziennika.
często również wykonać następujące czynności:
LOG_LEVEL = 'DEBUG' if DEBUG else 'INFO'
...
'level': LOG_LEVEL
...
Wtedy w moim kodu Pythona zawsze dodać NullHandler w przypadku rejestrowania conf nie jest zdefiniowana w ogóle. Zapobiega to ostrzeżeniom dla określonego Handler'a. Szczególnie przydatny dla bibliotekami, które niekoniecznie są wywoływane tylko w Django (ref)
import logging
# Get an instance of a logger
logger = logging.getLogger(__name__)
class NullHandler(logging.Handler): #exists in python 3.1
def emit(self, record):
pass
nullhandler = logger.addHandler(NullHandler())
# here you can also add some local logger should you want: to stdout with streamhandler, or to a local file...
[...]
logger.warning('etc.etc.')
Nadzieja to pomaga!
Poniższy screencast może być przydatny - http://ericholscher.com/blog/2008/aug/29/screencast-2-logging-fun-and-profit/. Lepsze wsparcie dla logowania w Django zaproponował Simon Willison (patrz http://simonwillison.net/2009/Sep/28/ponies/). –
@ Dominic Rodger - Możesz już robić elastyczne rejestrowanie aplikacji w Django, propozycji Simona, głównie w celu ułatwienia logowania w wewnętrznych Django.W Pythonie jest praca do dodania konfiguracji słownikowej do logowania Pythona, z którego może skorzystać Django. –