Commit a014ddfe authored by Claude Paroz's avatar Claude Paroz
Browse files

Combined Django DEFAULT_LOGGING with user LOGGING config

Refs #18993.
parent 15202baa
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -55,11 +55,15 @@ class LazySettings(LazyObject):
        Setup logging from LOGGING_CONFIG and LOGGING settings.
        """
        if self.LOGGING_CONFIG:
            from django.utils.log import DEFAULT_LOGGING
            # First find the logging configuration function ...
            logging_config_path, logging_config_func_name = self.LOGGING_CONFIG.rsplit('.', 1)
            logging_config_module = importlib.import_module(logging_config_path)
            logging_config_func = getattr(logging_config_module, logging_config_func_name)

            logging_config_func(DEFAULT_LOGGING)

            if self.LOGGING:
                # Backwards-compatibility shim for #16288 fix
                compat_patch_logging_config(self.LOGGING)

+2 −27
Original line number Diff line number Diff line
@@ -551,33 +551,8 @@ MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage'
# The callable to use to configure logging
LOGGING_CONFIG = 'django.utils.log.dictConfig'

# The default logging configuration. This sends an email to
# the site admins on every HTTP 500 error. All other log
# 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,
        },
    }
}
# Custom logging configuration.
LOGGING = {}

# Default exception reporter filter class used in case none has been
# specifically assigned to the HttpRequest instance.
+33 −6
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ from django.conf import settings
from django.core import mail
from django.views.debug import ExceptionReporter, get_exception_reporter_filter


# Make sure a NullHandler is available
# This was added in Python 2.7/3.2
try:
@@ -23,12 +24,38 @@ except ImportError:

getLogger = logging.getLogger

# Ensure the creation of the Django logger
# with a null handler. This ensures we don't get any
# 'No handlers could be found for logger "django"' messages
logger = getLogger('django')
if not logger.handlers:
    logger.addHandler(NullHandler())
# Default logging for Django. This sends an email to
# the site admins on every HTTP 500 error. All other log
# records are sent to the bit bucket.
DEFAULT_LOGGING = {
    'version': 1,
    '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):
+22 −0
Original line number Diff line number Diff line
@@ -192,6 +192,8 @@ There are two other logging calls available:
* ``logger.exception()``: Creates an ``ERROR`` level logging
  message wrapping the current exception stack frame.

.. _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
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
(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
@@ -535,3 +545,15 @@ logging module.
                '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``).