8000 gh-91555: Revert disabling of logger while handling log record. (GH-1… · python/cpython@18d32fb · GitHub
[go: up one dir, main page]

Skip to content

Commit 18d32fb

Browse files
authored
gh-91555: Revert disabling of logger while handling log record. (GH-135858)
Revert "gh-91555: disable logger while handling log record (GH-131812)" This reverts commit 2561e14.
1 parent ee0e22c commit 18d32fb

File tree

3 files changed

+8
-105
lines changed

3 files changed

+8
-105
lines changed

Lib/logging/__init__.py

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1475,8 +1475,6 @@ class Logger(Filterer):
14751475
level, and "input.csv", "input.xls" and "input.gnu" for the sub-levels.
14761476
There is no arbitrary limit to the depth of nesting.
14771477
"""
1478-
_tls = threading.local()
1479-
14801478
def __init__(self, name, level=NOTSET):
14811479
"""
14821480
Initialize the logger with a name and an optional level.
@@ -1673,19 +1671,14 @@ def handle(self, record):
16731671
This method is used for unpickled records received from a socket, as
16741672
well as those created locally. Logger-level filtering is applied.
16751673
"""
1676-
if self._is_disabled():
1674+
if self.disabled:
16771675
return
1678-
1679-
self._tls.in_progress = True
1680-
try:
1681-
maybe_record = self.filter(record)
1682-
if not maybe_record:
1683-
return
1684-
if isinstance(maybe_record, LogRecord):
1685-
record = maybe_record
1686-
self.callHandlers(record)
1687-
finally:
1688-
self._tls.in_progress = False
1676+
maybe_record = self.filter(record)
1677+
if not maybe_record:
1678+
return
1679+
if isinstance(maybe_record, LogRecord):
1680+
record = maybe_record
1681+
self.callHandlers(record)
16891682

16901683
def addHandler(self, hdlr):
16911684
"""
@@ -1773,7 +1766,7 @@ def isEnabledFor(self, level):
17731766
"""
17741767
Is this logger enabled for level 'level'?
17751768
"""
1776-
if self._is_disabled():
1769+
if self.disabled:
17771770
return False
17781771

17791772
try:
@@ -1823,11 +1816,6 @@ def _hierlevel(logger):
18231816
if isinstance(item, Logger) and item.parent is self and
18241817
_hierlevel(item) == 1 + _hierlevel(item.parent))
18251818

1826-
def _is_disabled(self):
1827-
# We need to use getattr as it will only be set the first time a log
1828-
# message is recorded on any given thread
1829-
return self.disabled or getattr(self._tls, 'in_progress', False)
1830-
18311819
def __repr__(self):
18321820
level = getLevelName(self.getEffectiveLevel())
18331821
return '<%s %s (%s)>' % (self.__class__.__name__, self.name, level)

Lib/test/test_logging.py

Lines changed: 0 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -4214,89 +4214,6 @@ def __init__(self, *args, **kwargs):
42144214
handler = logging.getHandlerByName('custom')
42154215
self.assertEqual(handler.custom_kwargs, custom_kwargs)
42164216

4217-
# See gh-91555 and gh-90321
4218-
@support.requires_subprocess()
4219-
def test_deadlock_in_queue(self):
4220-
queue = multiprocessing.Queue()
4221-
handler = logging.handlers.QueueHandler(queue)
4222-
logger = multiprocessing.get_logger()
4223-
level = logger.level
4224-
try:
4225-
logger.setLevel(logging.DEBUG)
4226-
logger.addHandler(handler)
4227-
logger.debug("deadlock")
4228-
finally:
4229-
logger.setLevel(level)
4230-
logger.removeHandler(handler)
4231-
4232-
def test_recursion_in_custom_handler(self):
4233-
class BadHandler(logging.Handler):
4234-
def __init__(self):
4235-
super().__init__()
4236-
def emit(self, record):
4237-
logger.debug("recurse")
4238-
logger = logging.getLogger("test_recursion_in_custom_handler")
4239-
logger.addHandler(BadHandler())
4240-
logger.setLevel(logging.DEBUG)
4241-
logger.debug("boom")
4242-
4243-
@threading_helper.requires_working_threading()
4244-
def test_thread_supression_noninterference(self):
4245-
lock = threading.Lock()
4246-
logger = logging.getLogger("test_thread_supression_noninterference")
4247-
4248-
# Block on the first call, allow others through
4249-
#
4250-
# NOTE: We need to bypass the base class's lock, otherwise that will
4251-
# block multiple calls to the same handler itself.
4252-
class BlockOnceHandler(TestHandler):
4253-
def __init__(self, barrier):
4254-
super().__init__(support.Matcher())
4255-
self.barrier = barrier
4256-
4257-
def createLock(self):
4258-
self.lock = None
4259-
4260-
def handle(self, record):
4261-
self.emit(record)
4262-
4263-
def emit(self, record):
4264-
if self.barrier:
4265-
barrier = self.barrier
4266-
self.barrier = None
4267-
barrier.wait()
4268-
with lock:
4269-
pass
4270-
super().emit(record)
4271-
logger.info("blow up if not supressed")
4272-
4273-
barrier = threading.Barrier(2)
4274-
handler = BlockOnceHandler(barrier)
4275-
logger.addHandler(handler)
4276-
logger.setLevel(logging.DEBUG)
4277-
4278-
t1 = threading.Thread(target=logger.debug, args=("1",))
4279-
with lock:
4280-
4281-
# Ensure first thread is blocked in the handler, hence supressing logging...
4282-
t1.start()
4283-
barrier.wait()
4284-
4285-
# ...but the second thread should still be able to log...
4286-
t2 = threading.Thread(target=logger.debug, args=("2",))
4287-
t2.start()
4288-
t2.join(timeout=3)
4289-
4290-
self.assertEqual(len(handler.buffer), 1)
4291-
self.assertTrue(handler.matches(levelno=logging.DEBUG, message='2'))
4292-
4293-
# The first thread should still be blocked here
4294-
self.assertTrue(t1.is_alive())
4295-
4296-
# Now the lock has been released the first thread should complete
4297-
t1.join()
4298-
self.assertEqual(len(handler.buffer), 2)
4299-
self.assertTrue(handler.matches(levelno=logging.DEBUG, message='1'))
43004217

43014218
class ManagerTest(BaseTest):
43024219
def test_manager_loggerclass(self):

Misc/NEWS.d/next/Library/2025-03-30-16-42-38.gh-issue-91555.ShVtwW.rst

Lines changed: 0 additions & 2 deletions
This file was deleted.

0 commit comments

Comments
 (0)
0