mirror of https://github.com/django/django.git
parent
15202baace
commit
a014ddfef2
|
@ -55,16 +55,20 @@ class LazySettings(LazyObject):
|
||||||
Setup logging from LOGGING_CONFIG and LOGGING settings.
|
Setup logging from LOGGING_CONFIG and LOGGING settings.
|
||||||
"""
|
"""
|
||||||
if self.LOGGING_CONFIG:
|
if self.LOGGING_CONFIG:
|
||||||
|
from django.utils.log import DEFAULT_LOGGING
|
||||||
# First find the logging configuration function ...
|
# First find the logging configuration function ...
|
||||||
logging_config_path, logging_config_func_name = self.LOGGING_CONFIG.rsplit('.', 1)
|
logging_config_path, logging_config_func_name = self.LOGGING_CONFIG.rsplit('.', 1)
|
||||||
logging_config_module = importlib.import_module(logging_config_path)
|
logging_config_module = importlib.import_module(logging_config_path)
|
||||||
logging_config_func = getattr(logging_config_module, logging_config_func_name)
|
logging_config_func = getattr(logging_config_module, logging_config_func_name)
|
||||||
|
|
||||||
# Backwards-compatibility shim for #16288 fix
|
logging_config_func(DEFAULT_LOGGING)
|
||||||
compat_patch_logging_config(self.LOGGING)
|
|
||||||
|
|
||||||
# ... then invoke it with the logging settings
|
if self.LOGGING:
|
||||||
logging_config_func(self.LOGGING)
|
# Backwards-compatibility shim for #16288 fix
|
||||||
|
compat_patch_logging_config(self.LOGGING)
|
||||||
|
|
||||||
|
# ... then invoke it with the logging settings
|
||||||
|
logging_config_func(self.LOGGING)
|
||||||
|
|
||||||
def configure(self, default_settings=global_settings, **options):
|
def configure(self, default_settings=global_settings, **options):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -551,33 +551,8 @@ MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage'
|
||||||
# The callable to use to configure logging
|
# The callable to use to configure logging
|
||||||
LOGGING_CONFIG = 'django.utils.log.dictConfig'
|
LOGGING_CONFIG = 'django.utils.log.dictConfig'
|
||||||
|
|
||||||
# The default logging configuration. This sends an email to
|
# Custom logging configuration.
|
||||||
# the site admins on every HTTP 500 error. All other log
|
LOGGING = {}
|
||||||
# records are sent to the bit bucket.
|
|
||||||
|
|
||||||
LOGGING = {
|
|
||||||
'version': 1,
|
|
||||||
'disable_existing_loggers': False,
|
|
||||||
'filters': {
|
|
||||||
'require_debug_false': {
|
|
||||||
'()': 'django.utils.log.RequireDebugFalse',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'handlers': {
|
|
||||||
'mail_admins': {
|
|
||||||
'level': 'ERROR',
|
|
||||||
'filters': ['require_debug_false'],
|
|
||||||
'class': 'django.utils.log.AdminEmailHandler'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'loggers': {
|
|
||||||
'django.request': {
|
|
||||||
'handlers': ['mail_admins'],
|
|
||||||
'level': 'ERROR',
|
|
||||||
'propagate': True,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Default exception reporter filter class used in case none has been
|
# Default exception reporter filter class used in case none has been
|
||||||
# specifically assigned to the HttpRequest instance.
|
# specifically assigned to the HttpRequest instance.
|
||||||
|
|
|
@ -5,6 +5,7 @@ from django.conf import settings
|
||||||
from django.core import mail
|
from django.core import mail
|
||||||
from django.views.debug import ExceptionReporter, get_exception_reporter_filter
|
from django.views.debug import ExceptionReporter, get_exception_reporter_filter
|
||||||
|
|
||||||
|
|
||||||
# Make sure a NullHandler is available
|
# Make sure a NullHandler is available
|
||||||
# This was added in Python 2.7/3.2
|
# This was added in Python 2.7/3.2
|
||||||
try:
|
try:
|
||||||
|
@ -23,12 +24,38 @@ except ImportError:
|
||||||
|
|
||||||
getLogger = logging.getLogger
|
getLogger = logging.getLogger
|
||||||
|
|
||||||
# Ensure the creation of the Django logger
|
# Default logging for Django. This sends an email to
|
||||||
# with a null handler. This ensures we don't get any
|
# the site admins on every HTTP 500 error. All other log
|
||||||
# 'No handlers could be found for logger "django"' messages
|
# records are sent to the bit bucket.
|
||||||
logger = getLogger('django')
|
DEFAULT_LOGGING = {
|
||||||
if not logger.handlers:
|
'version': 1,
|
||||||
logger.addHandler(NullHandler())
|
'disable_existing_loggers': False,
|
||||||
|
'filters': {
|
||||||
|
'require_debug_false': {
|
||||||
|
'()': 'django.utils.log.RequireDebugFalse',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'handlers': {
|
||||||
|
'null': {
|
||||||
|
'class': 'django.utils.log.NullHandler',
|
||||||
|
},
|
||||||
|
'mail_admins': {
|
||||||
|
'level': 'ERROR',
|
||||||
|
'filters': ['require_debug_false'],
|
||||||
|
'class': 'django.utils.log.AdminEmailHandler'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'loggers': {
|
||||||
|
'django': {
|
||||||
|
'handlers': ['null'],
|
||||||
|
},
|
||||||
|
'django.request': {
|
||||||
|
'handlers': ['mail_admins'],
|
||||||
|
'level': 'ERROR',
|
||||||
|
'propagate': True,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class AdminEmailHandler(logging.Handler):
|
class AdminEmailHandler(logging.Handler):
|
||||||
|
|
|
@ -192,6 +192,8 @@ There are two other logging calls available:
|
||||||
* ``logger.exception()``: Creates an ``ERROR`` level logging
|
* ``logger.exception()``: Creates an ``ERROR`` level logging
|
||||||
message wrapping the current exception stack frame.
|
message wrapping the current exception stack frame.
|
||||||
|
|
||||||
|
.. _configuring-logging:
|
||||||
|
|
||||||
Configuring logging
|
Configuring logging
|
||||||
===================
|
===================
|
||||||
|
|
||||||
|
@ -216,6 +218,14 @@ handlers, filters and formatters that you want in your logging setup,
|
||||||
and the log levels and other properties that you want those components
|
and the log levels and other properties that you want those components
|
||||||
to have.
|
to have.
|
||||||
|
|
||||||
|
Prior to Django 1.5, the :setting:`LOGGING` setting overwrote the :ref:`default
|
||||||
|
Django logging configuration <default-logging-configuration>`. From Django
|
||||||
|
1.5 forward, the project's logging configuration is merged with Django's
|
||||||
|
defaults, hence you can decide if you want to add to, or replace the existing
|
||||||
|
configuration. To completely override the default configuration, set the
|
||||||
|
``disable_existing_loggers`` key to True in the :setting:`LOGGING`
|
||||||
|
dictConfig. Alternatively you can redefine some or all of the loggers.
|
||||||
|
|
||||||
Logging is configured as soon as settings have been loaded
|
Logging is configured as soon as settings have been loaded
|
||||||
(either manually using :func:`~django.conf.settings.configure` or when at least
|
(either manually using :func:`~django.conf.settings.configure` or when at least
|
||||||
one setting is accessed). Since the loading of settings is one of the first
|
one setting is accessed). Since the loading of settings is one of the first
|
||||||
|
@ -535,3 +545,15 @@ logging module.
|
||||||
'class': 'django.utils.log.AdminEmailHandler'
|
'class': 'django.utils.log.AdminEmailHandler'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
.. _default-logging-configuration:
|
||||||
|
|
||||||
|
Django's default logging configuration
|
||||||
|
======================================
|
||||||
|
|
||||||
|
By default, Django configures the ``django.request`` logger so that all messages
|
||||||
|
with ``ERROR`` or ``CRITICAL`` level are sent to :class:`AdminEmailHandler`, as
|
||||||
|
long as the :setting:`DEBUG` setting is set to ``False``.
|
||||||
|
|
||||||
|
All messages reaching the ``django`` catch-all logger are discarded
|
||||||
|
(sent to ``NullHandler``).
|
||||||
|
|
Loading…
Reference in New Issue