New submission from Irit Katriel <iritkatr...@yahoo.com>:
The `logging.handlers.MemoryHandler.setTarget()` method does not acquire the lock, so it can change the target while flush is processing the buffer. The script below causes flush to call target.handle when target is None, causing: File "C:\Users\User\src\cpython\lib\logging\handlers.py", line 1265, in emit self.flush() File "C:\Users\User\src\cpython\lib\logging\handlers.py", line 1348, in flush self.target.handle(record) AttributeError: 'NoneType' object has no attribute 'handle' ------------------------------------------------ import io import logging.handlers import threading import time class SlowHandler: def __init__(self): self.stream = io.StringIO() self.streamHandler = logging.StreamHandler(self.stream) def handle(self, msg): time.sleep(1) self.streamHandler.handle(msg) target = SlowHandler() mem_hdlr = logging.handlers.MemoryHandler(10, logging.ERROR, target) mem_logger = logging.getLogger('mem') mem_logger.propagate = False mem_logger.addHandler(mem_hdlr) def toggleTarget(): time.sleep(1) mem_hdlr.setTarget(None) t = threading.Thread(target=toggleTarget, args=()) t.daemon = True t.start() while True: time.sleep(0.1) mem_logger.warning("warning not flushed") mem_logger.error("error is flushed") ------------------------------------------------ ---------- components: Library (Lib) messages: 375001 nosy: iritkatriel priority: normal severity: normal status: open title: Race between setTarget and flush in logging.handlers.MemoryHandler type: behavior versions: Python 3.10 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue41503> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com