summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVinay Sajip <vinay_sajip@yahoo.co.uk>2011-03-07 18:02:57 (GMT)
committerVinay Sajip <vinay_sajip@yahoo.co.uk>2011-03-07 18:02:57 (GMT)
commit9f9991c2f565cc9494a7bac163f1e2c34afffc09 (patch)
treee99429ac0a63d7907fb67f6b6a851d0b1e39f76a
parente783553daaf27d05388d0190ffbf4d0d0a221fba (diff)
downloadcpython-9f9991c2f565cc9494a7bac163f1e2c34afffc09.zip
cpython-9f9991c2f565cc9494a7bac163f1e2c34afffc09.tar.gz
cpython-9f9991c2f565cc9494a7bac163f1e2c34afffc09.tar.bz2
#Issue 11424: added equivalent fixes for dictConfig.
-rw-r--r--Lib/logging/config.py11
-rw-r--r--Lib/test/test_logging.py105
2 files changed, 109 insertions, 7 deletions
diff --git a/Lib/logging/config.py b/Lib/logging/config.py
index 52797ce..c7359ca 100644
--- a/Lib/logging/config.py
+++ b/Lib/logging/config.py
@@ -596,15 +596,14 @@ class DictConfigurator(BaseConfigurator):
loggers = config.get('loggers', EMPTY_DICT)
for name in loggers:
if name in existing:
- i = existing.index(name)
+ i = existing.index(name) + 1 # look after name
prefixed = name + "."
pflen = len(prefixed)
num_existing = len(existing)
- i = i + 1 # look at the entry after name
- while (i < num_existing) and\
- (existing[i][:pflen] == prefixed):
- child_loggers.append(existing[i])
- i = i + 1
+ while i < num_existing:
+ if existing[i][:pflen] == prefixed:
+ child_loggers.append(existing[i])
+ i += 1
existing.remove(name)
try:
self.configure_logger(name, loggers[name])
diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py
index e05f7b8..b62545c 100644
--- a/Lib/test/test_logging.py
+++ b/Lib/test/test_logging.py
@@ -1170,6 +1170,33 @@ class ConfigDictTest(BaseTest):
},
}
+ # config1a moves the handler to the root. Used with config8a
+ config1a = {
+ 'version': 1,
+ 'formatters': {
+ 'form1' : {
+ 'format' : '%(levelname)s ++ %(message)s',
+ },
+ },
+ 'handlers' : {
+ 'hand1' : {
+ 'class' : 'logging.StreamHandler',
+ 'formatter' : 'form1',
+ 'level' : 'NOTSET',
+ 'stream' : 'ext://sys.stdout',
+ },
+ },
+ 'loggers' : {
+ 'compiler.parser' : {
+ 'level' : 'DEBUG',
+ },
+ },
+ 'root' : {
+ 'level' : 'WARNING',
+ 'handlers' : ['hand1'],
+ },
+ }
+
# config2 has a subtle configuration error that should be reported
config2 = {
'version': 1,
@@ -1420,6 +1447,9 @@ class ConfigDictTest(BaseTest):
},
}
+ # config8 defines both compiler and compiler.lexer
+ # so compiler.parser should not be disabled (since
+ # compiler is defined)
config8 = {
'version': 1,
'disable_existing_loggers' : False,
@@ -1449,6 +1479,36 @@ class ConfigDictTest(BaseTest):
},
}
+ # config8a disables existing loggers
+ config8a = {
+ 'version': 1,
+ 'disable_existing_loggers' : True,
+ 'formatters': {
+ 'form1' : {
+ 'format' : '%(levelname)s ++ %(message)s',
+ },
+ },
+ 'handlers' : {
+ 'hand1' : {
+ 'class' : 'logging.StreamHandler',
+ 'formatter' : 'form1',
+ 'level' : 'NOTSET',
+ 'stream' : 'ext://sys.stdout',
+ },
+ },
+ 'loggers' : {
+ 'compiler' : {
+ 'level' : 'DEBUG',
+ 'handlers' : ['hand1'],
+ },
+ 'compiler.lexer' : {
+ },
+ },
+ 'root' : {
+ 'level' : 'WARNING',
+ },
+ }
+
config9 = {
'version': 1,
'formatters': {
@@ -1749,7 +1809,7 @@ class ConfigDictTest(BaseTest):
with captured_stdout() as output:
self.apply_config(self.config1)
logger = logging.getLogger("compiler.parser")
- # Both will output a message
+ # All will output a message
logger.info(self.next_message())
logger.error(self.next_message())
self.assert_log_lines([
@@ -1778,6 +1838,49 @@ class ConfigDictTest(BaseTest):
# Original logger output is empty.
self.assert_log_lines([])
+ def test_config_8a_ok(self):
+ with captured_stdout() as output:
+ self.apply_config(self.config1a)
+ logger = logging.getLogger("compiler.parser")
+ # See issue #11424. compiler-hyphenated sorts
+ # between compiler and compiler.xyz and this
+ # was preventing compiler.xyz from being included
+ # in the child loggers of compiler because of an
+ # overzealous loop termination condition.
+ hyphenated = logging.getLogger('compiler-hyphenated')
+ # All will output a message
+ logger.info(self.next_message())
+ logger.error(self.next_message())
+ hyphenated.critical(self.next_message())
+ self.assert_log_lines([
+ ('INFO', '1'),
+ ('ERROR', '2'),
+ ('CRITICAL', '3'),
+ ], stream=output)
+ # Original logger output is empty.
+ self.assert_log_lines([])
+ with captured_stdout() as output:
+ self.apply_config(self.config8a)
+ logger = logging.getLogger("compiler.parser")
+ self.assertFalse(logger.disabled)
+ # Both will output a message
+ logger.info(self.next_message())
+ logger.error(self.next_message())
+ logger = logging.getLogger("compiler.lexer")
+ # Both will output a message
+ logger.info(self.next_message())
+ logger.error(self.next_message())
+ # Will not appear
+ hyphenated.critical(self.next_message())
+ self.assert_log_lines([
+ ('INFO', '4'),
+ ('ERROR', '5'),
+ ('INFO', '6'),
+ ('ERROR', '7'),
+ ], stream=output)
+ # Original logger output is empty.
+ self.assert_log_lines([])
+
def test_config_9_ok(self):
with captured_stdout() as output:
self.apply_config(self.config9)