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

Abierto
#1,491 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
58/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
jupyter, jupyter-notebook, python
Área
backend

Línea de trabajo

Ejecuta el ejemplo mínimo de tres celdas con ipykernel 6.28.0 y 6.29.0, centrándote en Logger.write_from_queue, Logger.log y el sink sys.stderr. Rastrea cómo se asocia la salida del hilo auxiliar con las celdas del notebook. Se considera terminado cuando los mensajes de la celda 3 y de las celdas posteriores aparecen en su celda correspondiente, en lugar de en la celda de inicialización del logger.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

I recently found that, with some configurations, log messages emitted by 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.)

Lenguaje dominante
Python
Estrellas
734
Forks
411
Merge medio
1 d 2 h
PR fusionados (30 d)
9

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de ipython/ipykernel

Todos los issues de ipython/ipykernel

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.