Я знаю, что это уже решенный ответ, но согласно django> = 1.3 есть новый параметр ведения журнала.
Переход от старого к новому не происходит автоматически, поэтому я подумал, что запишу его здесь.
И, конечно же, посмотрите документацию django, чтобы узнать больше.
Это базовая конфигурация, созданная по умолчанию с помощью django-admin createproject v1.3 - пробег может измениться с последними версиями 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,
}
}
}
Эта структура основана на стандартном протоколе Python dictConfig , который определяет следующие блоки:
formatters
- соответствующее значение будет диктовкой, в которой каждый ключ является идентификатором средства форматирования, а каждое значение является диктовкой, описывающей, как настроить соответствующий экземпляр средства форматирования.
filters
- соответствующее значение будет dict, в котором каждый ключ является идентификатором фильтра, а каждое значение - dict, описывающим, как настроить соответствующий экземпляр фильтра.
handlers
- соответствующее значение будет dict, в котором каждый ключ является идентификатором обработчика, а каждое значение - dict, описывающим, как настроить соответствующий экземпляр Handler. У каждого обработчика есть следующие ключи:
class
(обязательное). Это полное имя класса обработчика.
level
(по желанию). Уровень обработчика.
formatter
(по желанию). Идентификатор средства форматирования для этого обработчика.
filters
(по желанию). Список идентификаторов фильтров для этого обработчика.
Я обычно делаю по крайней мере так:
- добавить файл .log
- настроить мои приложения для записи в этот журнал
Что означает:
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'
},
}
редактировать
См. Исключения запросов теперь всегда регистрируются, и билет № 16288 :
Я обновил приведенный выше образец conf, чтобы явно включить правильный фильтр для mail_admins, чтобы по умолчанию электронные письма не отправлялись, когда отладка имеет значение True.
Вам следует добавить фильтр:
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
и примените его к обработчику mail_admins:
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
}
В противном случае django.core.handers.base.handle_uncaught_exception
не передает ошибки в регистратор django.request, если settings.DEBUG имеет значение True.
Если вы этого не сделаете в Django 1.5, вы получите
DeprecationWarning: у вас нет фильтров, определенных в обработчике ведения журнала mail_admins: добавление неявного фильтра debug-false-only
но все будет работать правильно ОБЕИХ в django 1.4 и django 1.5.
** конец редактирования **
Этот conf сильно вдохновлен примером conf в django doc, но с добавлением части файла журнала.
Я также часто делаю следующее:
LOG_LEVEL = 'DEBUG' if DEBUG else 'INFO'
...
'level': LOG_LEVEL
...
Затем в моем коде на Python я всегда добавляю NullHandler на случай, если вообще не определена конфигурация журнала. Это позволяет избежать предупреждений о том, что обработчик не указан. Особенно полезно для библиотек, которые не обязательно вызываются только в Django ( ссылка )
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.')
Надеюсь это поможет!