From e6af2db66ce01dfb6a6ec60fae464a5e17a14d9c Mon Sep 17 00:00:00 2001 From: Carsten Haubold Date: Tue, 13 Jan 2026 16:12:06 +0100 Subject: [PATCH] AP-25516: Derive log handler from Handler instead of StreamHandler to allow reconfiguring it The real issue is that KnimeLogHandler inherits from StreamHandler, which by default sets self.stream = sys.stderr. When logging.shutdown() is called during extension loading, it might be triggering a cascade where flushing stderr somehow loops back. The solution is to inherit from logging.Handler directly instead of StreamHandler, since we're not actually using a stream --- .../src/main/python/_node_backend_launcher.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/org.knime.python3.nodes/src/main/python/_node_backend_launcher.py b/org.knime.python3.nodes/src/main/python/_node_backend_launcher.py index dd0d9333b..68e5a5c03 100644 --- a/org.knime.python3.nodes/src/main/python/_node_backend_launcher.py +++ b/org.knime.python3.nodes/src/main/python/_node_backend_launcher.py @@ -1795,9 +1795,9 @@ class Java: implements = ["org.knime.python3.nodes.KnimeNodeBackend"] -class KnimeLogHandler(logging.StreamHandler): +class KnimeLogHandler(logging.Handler): def __init__(self, backend): - super().__init__(self) + super().__init__() self.setFormatter(logging.Formatter("%(name)s:%(message)s")) self._backend = backend