summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVinay Sajip <vinay_sajip@yahoo.co.uk>2023-12-27 09:35:15 (GMT)
committerGitHub <noreply@github.com>2023-12-27 09:35:15 (GMT)
commit67655d8ad5de8666c97b0a377c6141a6abf66350 (patch)
treeb001494b7bd8bb41bff394db1eabb01dd12f1c2f
parent00cdd416fc60876ff21d9eafdc5d5d7a91737db5 (diff)
downloadcpython-67655d8ad5de8666c97b0a377c6141a6abf66350.zip
cpython-67655d8ad5de8666c97b0a377c6141a6abf66350.tar.gz
cpython-67655d8ad5de8666c97b0a377c6141a6abf66350.tar.bz2
gh-111615: Fix regression in QueueHandler configuration. (GH-111638)
-rw-r--r--Lib/logging/config.py36
-rw-r--r--Lib/test/test_logging.py19
-rw-r--r--Misc/NEWS.d/next/Library/2023-11-02-10-13-31.gh-issue-111615.3SMixi.rst2
3 files changed, 40 insertions, 17 deletions
diff --git a/Lib/logging/config.py b/Lib/logging/config.py
index 4b520e3..de06090 100644
--- a/Lib/logging/config.py
+++ b/Lib/logging/config.py
@@ -1,4 +1,4 @@
-# Copyright 2001-2022 by Vinay Sajip. All Rights Reserved.
+# Copyright 2001-2023 by Vinay Sajip. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted,
@@ -734,7 +734,7 @@ class DictConfigurator(BaseConfigurator):
lklass = kwargs['listener']
else:
lklass = logging.handlers.QueueListener
- listener = lklass(q, *kwargs['handlers'], respect_handler_level=rhl)
+ listener = lklass(q, *kwargs.get('handlers', []), respect_handler_level=rhl)
handler = klass(q)
handler.listener = listener
return handler
@@ -776,11 +776,12 @@ class DictConfigurator(BaseConfigurator):
raise ValueError('Unable to set target handler %r' % tn) from e
elif issubclass(klass, logging.handlers.QueueHandler):
# Another special case for handler which refers to other handlers
- if 'handlers' not in config:
- raise ValueError('No handlers specified for a QueueHandler')
+ # if 'handlers' not in config:
+ # raise ValueError('No handlers specified for a QueueHandler')
if 'queue' in config:
+ from multiprocessing.queues import Queue as MPQueue
qspec = config['queue']
- if not isinstance(qspec, queue.Queue):
+ if not isinstance(qspec, (queue.Queue, MPQueue)):
if isinstance(qspec, str):
q = self.resolve(qspec)
if not callable(q):
@@ -813,18 +814,19 @@ class DictConfigurator(BaseConfigurator):
if not callable(listener):
raise TypeError('Invalid listener specifier %r' % lspec)
config['listener'] = listener
- hlist = []
- try:
- for hn in config['handlers']:
- h = self.config['handlers'][hn]
- if not isinstance(h, logging.Handler):
- config.update(config_copy) # restore for deferred cfg
- raise TypeError('Required handler %r '
- 'is not configured yet' % hn)
- hlist.append(h)
- except Exception as e:
- raise ValueError('Unable to set required handler %r' % hn) from e
- config['handlers'] = hlist
+ if 'handlers' in config:
+ hlist = []
+ try:
+ for hn in config['handlers']:
+ h = self.config['handlers'][hn]
+ if not isinstance(h, logging.Handler):
+ config.update(config_copy) # restore for deferred cfg
+ raise TypeError('Required handler %r '
+ 'is not configured yet' % hn)
+ hlist.append(h)
+ except Exception as e:
+ raise ValueError('Unable to set required handler %r' % hn) from e
+ config['handlers'] = hlist
elif issubclass(klass, logging.handlers.SMTPHandler) and\
'mailhost' in config:
config['mailhost'] = self.as_tuple(config['mailhost'])
diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py
index 89be432..33db5d6 100644
--- a/Lib/test/test_logging.py
+++ b/Lib/test/test_logging.py
@@ -3922,6 +3922,25 @@ class ConfigDictTest(BaseTest):
# Logger should be enabled, since explicitly mentioned
self.assertFalse(logger.disabled)
+ def test_111615(self):
+ # See gh-111615
+ import multiprocessing as mp
+
+ config = {
+ 'version': 1,
+ 'handlers': {
+ 'sink': {
+ 'class': 'logging.handlers.QueueHandler',
+ 'queue': mp.get_context('spawn').Queue(),
+ },
+ },
+ 'root': {
+ 'handlers': ['sink'],
+ 'level': 'DEBUG',
+ },
+ }
+ logging.config.dictConfig(config)
+
class ManagerTest(BaseTest):
def test_manager_loggerclass(self):
logged = []
diff --git a/Misc/NEWS.d/next/Library/2023-11-02-10-13-31.gh-issue-111615.3SMixi.rst b/Misc/NEWS.d/next/Library/2023-11-02-10-13-31.gh-issue-111615.3SMixi.rst
new file mode 100644
index 0000000..f80ab00
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-11-02-10-13-31.gh-issue-111615.3SMixi.rst
@@ -0,0 +1,2 @@
+Fix a regression caused by a fix to gh-93162 whereby you couldn't configure
+a :class:`QueueHandler` without specifying handlers.