Skip to content

Commit e9f6079

Browse files
committed
pythongh-91555: disable logger while handling log record
Prevent the possibility of re-entrancy and deadlock or infinite recursion caused by logging triggered by logging by disabling logging while the logger is handling log messages.
1 parent 8a00c9a commit e9f6079

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

Lib/logging/__init__.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1459,6 +1459,9 @@ def _clear_cache(self):
14591459
# Logger classes and functions
14601460
#---------------------------------------------------------------------------
14611461

1462+
_tls = threading.local()
1463+
_tls.in_progress = False
1464+
14621465
class Logger(Filterer):
14631466
"""
14641467
Instances of the Logger class represent a single logging channel. A
@@ -1670,14 +1673,19 @@ def handle(self, record):
16701673
This method is used for unpickled records received from a socket, as
16711674
well as those created locally. Logger-level filtering is applied.
16721675
"""
1673-
if self.disabled:
1674-
return
1675-
maybe_record = self.filter(record)
1676-
if not maybe_record:
1676+
if self._is_disabled():
16771677
return
1678-
if isinstance(maybe_record, LogRecord):
1679-
record = maybe_record
1680-
self.callHandlers(record)
1678+
1679+
_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+
_tls.in_progress = False
16811689

16821690
def addHandler(self, hdlr):
16831691
"""
@@ -1765,7 +1773,7 @@ def isEnabledFor(self, level):
17651773
"""
17661774
Is this logger enabled for level 'level'?
17671775
"""
1768-
if self.disabled:
1776+
if self._is_disabled():
17691777
return False
17701778

17711779
try:
@@ -1815,6 +1823,9 @@ def _hierlevel(logger):
18151823
if isinstance(item, Logger) and item.parent is self and
18161824
_hierlevel(item) == 1 + _hierlevel(item.parent))
18171825

1826+
def _is_disabled(self):
1827+
return self.disabled or getattr(_tls, 'in_progress', False)
1828+
18181829
def __repr__(self):
18191830
level = getLevelName(self.getEffectiveLevel())
18201831
return '<%s %s (%s)>' % (self.__class__.__name__, self.name, level)

0 commit comments

Comments
 (0)