ipython / ipython/ipykernel

Log messages written from a helper thread appear in the wrong notebook cell (regression)

Open
#1,491 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
734
Forks
412
Avg merge
1d 5h
Merged PRs (30d)
8

Description

I recently found that, with some configurations, log messages emitted by [Loguru](https://github.com/Delgan/loguru) would appear in the wrong Jupyter notebook cell: namely, the cell that initialized the logger, rather than the cell that was responsible for the log message. I opened Delgan/loguru#1427 to address this, but have since closed it, since the issue appears to be a regression in `ipykernel`, not in Loguru itself.

The problem appears for all versions of Loguru, but only for ipykernel >= 6.29. It is confined to the case where the logger is configured to write messages using a separate helper thread, which is useful when logging from multiple threads simultaneously. A minimal working example that illustrates the issue _without_ the use of Loguru is the following:

(cell 1)
```
import sys
import multiprocessing
import threading

class Logger:
def __init__(self, sink):
self.sink = sink
self.queue = multiprocessing.SimpleQueue()
self.lock = threading.Lock()
self.thread = threading.Thread(target=self.write_from_queue, daemon=True)
self.thread.start()

def write_from_queue(self):
while True:
message = self.queue.get()
with self.lock:
self.sink.write(message)

def log(self, message):
self.queue.put(message)
```

(cell 2)
```
logger = Logger(sink=sys.stderr)
```

(cell 3)
```
logger.log("a message")
```

With ipykernel 6.28.0, the log message appears under cell 3, as intended, but with 6.29.0, it appears under cell 2 instead, and subsequent messages logged using the same `logger` will always appear under cell 2.

(Note: I tested with Jupyter Notebook 7.5.0 and Python 3.12.11 on Ubuntu 24.04.)

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.