Использование Django 1.5.1:
DEBUG = False
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(message)s'
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'verbose',
},
},
'loggers': {
# root logger
'': {
'handlers': ['console'],
},
#'django.request': {
# 'handlers': ['console'],
# 'level': 'DEBUG',
# 'propagate': False,
#},
}
}
Если я раскомментирую прокомментированные строки и вызову вид, который имеет 1/0
, трассировка печатается на консоль:
ERROR 2013-11-29 13:33:23,102 base Internal Server Error: /comment/*******/
Traceback (most recent call last):
...
File "*****/comments/views.py", line 10, in post
1/0
ZeroDivisionError: integer division or modulo by zero
WARNING 2013-11-29 13:33:23,103 csrf Forbidden (CSRF cookie not set.): /comment/******/
[29/Nov/2013 13:33:23] "POST /comment/******/ HTTP/1.0" 500 27
Но если строки остаются прокомментированными, на консоль не выводится трассировка, просто:
[29/Nov/2013 13:33:23] "POST /comment/******/ HTTP/1.0" 500 27
Я думал, что если django.request
logger не настроен, он будет распространяться на корневой журнал, который печатает все на консоли.
Я не нашел информации о том, что django.request
является специальным.
Почему это не работает?
Здесь Я читал:
До Django 1.5 параметр LOGGING всегда перезаписывал конфигурацию регистрации Django по умолчанию. Начиная с Django 1.5 вперед можно включить конфигурацию регистрации проектов, объединенную с по умолчанию Djangos, поэтому вы можете решить, хотите ли вы добавить или заменить существующую конфигурацию.
Если для параметра disable_existing_loggers в LOGGING dictConfig установлено значение True (по умолчанию), конфигурация по умолчанию полностью переопределена. В качестве альтернативы вы можете переопределить некоторые или все регистраторы, установив disable_existing_loggers на False.
В django/utils/log.py
:
# Default logging for Django. This sends an email to the site admins on every
# HTTP 500 error. Depending on DEBUG, all other log records are either sent to
# the console (DEBUG=True) or discarded by mean of the NullHandler (DEBUG=False).
DEFAULT_LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': {
'console':{
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
},
'null': {
'class': 'django.utils.log.NullHandler',
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django': {
'handlers': ['console'],
},
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': False,
},
'py.warnings': {
'handlers': ['console'],
},
}
}
Итак, по умолчанию django.request
имеет propagate = False
. Но в моем случае у меня есть 'disable_existing_loggers': True
.