Refs #24526 -- Made the django logger handle INFO messages.

Without an explicit 'level', only messages at WARNING or higher
are handled. This makes the config consistent with the docs
which say, "The django catch-all logger sends all messages at
the INFO level or higher to the console."
This commit is contained in:
Tim Graham 2015-09-15 14:13:34 -04:00
parent 7cb3a48843
commit 6b37719616
4 changed files with 34 additions and 3 deletions

View File

@ -42,6 +42,7 @@ DEFAULT_LOGGING = {
'loggers': { 'loggers': {
'django': { 'django': {
'handlers': ['console', 'mail_admins'], 'handlers': ['console', 'mail_admins'],
'level': 'INFO',
}, },
'py.warnings': { 'py.warnings': {
'handlers': ['console'], 'handlers': ['console'],

View File

@ -827,7 +827,8 @@ Changes to the default logging configuration
To make it easier to write custom logging configurations, Django's default To make it easier to write custom logging configurations, Django's default
logging configuration no longer defines 'django.request' and 'django.security' logging configuration no longer defines 'django.request' and 'django.security'
loggers. Instead, it defines a single 'django' logger with two handlers: loggers. Instead, it defines a single 'django' logger, filtered at the ``INFO``
level, with two handlers:
* 'console': filtered at the ``INFO`` level and only active if ``DEBUG=True``. * 'console': filtered at the ``INFO`` level and only active if ``DEBUG=True``.
* 'mail_admins': filtered at the ``ERROR`` level and only active if * 'mail_admins': filtered at the ``ERROR`` level and only active if

View File

@ -6,6 +6,7 @@ import warnings
from admin_scripts.tests import AdminScriptTestCase from admin_scripts.tests import AdminScriptTestCase
from django.conf import settings
from django.core import mail from django.core import mail
from django.core.files.temp import NamedTemporaryFile from django.core.files.temp import NamedTemporaryFile
from django.test import RequestFactory, SimpleTestCase, override_settings from django.test import RequestFactory, SimpleTestCase, override_settings
@ -13,7 +14,8 @@ from django.test.utils import LoggingCaptureMixin, patch_logger
from django.utils.deprecation import RemovedInNextVersionWarning from django.utils.deprecation import RemovedInNextVersionWarning
from django.utils.encoding import force_text from django.utils.encoding import force_text
from django.utils.log import ( from django.utils.log import (
AdminEmailHandler, CallbackFilter, RequireDebugFalse, RequireDebugTrue, DEFAULT_LOGGING, AdminEmailHandler, CallbackFilter, RequireDebugFalse,
RequireDebugTrue,
) )
from django.utils.six import StringIO from django.utils.six import StringIO
@ -67,6 +69,17 @@ class LoggingFiltersTest(SimpleTestCase):
class DefaultLoggingTest(LoggingCaptureMixin, SimpleTestCase): class DefaultLoggingTest(LoggingCaptureMixin, SimpleTestCase):
@classmethod
def setUpClass(cls):
super(DefaultLoggingTest, cls).setUpClass()
cls._logging = settings.LOGGING
logging.config.dictConfig(DEFAULT_LOGGING)
@classmethod
def tearDownClass(cls):
super(DefaultLoggingTest, cls).tearDownClass()
logging.config.dictConfig(cls._logging)
def test_django_logger(self): def test_django_logger(self):
""" """
The 'django' base logger only output anything when DEBUG=True. The 'django' base logger only output anything when DEBUG=True.
@ -78,6 +91,21 @@ class DefaultLoggingTest(LoggingCaptureMixin, SimpleTestCase):
self.logger.error("Hey, this is an error.") self.logger.error("Hey, this is an error.")
self.assertEqual(self.logger_output.getvalue(), 'Hey, this is an error.\n') self.assertEqual(self.logger_output.getvalue(), 'Hey, this is an error.\n')
def test_django_logger_warning(self):
with self.settings(DEBUG=True):
self.logger.warning('warning')
self.assertEqual(self.logger_output.getvalue(), 'warning\n')
def test_django_logger_info(self):
with self.settings(DEBUG=True):
self.logger.info('info')
self.assertEqual(self.logger_output.getvalue(), 'info\n')
def test_django_logger_debug(self):
with self.settings(DEBUG=True):
self.logger.debug('debug')
self.assertEqual(self.logger_output.getvalue(), '')
class WarningLoggerTests(SimpleTestCase): class WarningLoggerTests(SimpleTestCase):
""" """

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python #!/usr/bin/env python
import atexit import atexit
import copy
import logging import logging
import os import os
import shutil import shutil
@ -154,7 +155,7 @@ def setup(verbosity, test_labels, parallel):
'contenttypes': 'contenttypes_tests.migrations', 'contenttypes': 'contenttypes_tests.migrations',
'sessions': 'sessions_tests.migrations', 'sessions': 'sessions_tests.migrations',
} }
log_config = DEFAULT_LOGGING log_config = copy.deepcopy(DEFAULT_LOGGING)
# Filter out non-error logging so we don't have to capture it in lots of # Filter out non-error logging so we don't have to capture it in lots of
# tests. # tests.
log_config['loggers']['django']['level'] = 'ERROR' log_config['loggers']['django']['level'] = 'ERROR'