Obtenga resultados del módulo de registro en IPython Notebook

127

Cuando ejecuto lo siguiente dentro de IPython Notebook, no veo ningún resultado:

import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("test")

¿Alguien sabe cómo hacerlo para que pueda ver el mensaje de "prueba" dentro del cuaderno?

Kyle Brandt
fuente
¿Qué versión de IPython está utilizando, ya que esto funciona en 1.0?
Viktor Kerkez
@ViktorKerkez ipython3 notebook --versionregresa1.0.0
Kyle Brandt
imgur.com/1b7nGZz Obtengo esto cuando pruebo su código.
Viktor Kerkez
@ViktorKerkez: Sí, no entiendo eso, supongo que debería presentar un problema ...
Kyle Brandt

Respuestas:

129

Intenta lo siguiente:

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test")

De acuerdo con logging.basicConfig :

Realiza la configuración básica para el sistema de registro creando un StreamHandler con un formateador predeterminado y agregándolo al registrador raíz. Las funciones debug (), info (), warning (), error () y critical () llamarán a basicConfig () automáticamente si no hay controladores definidos para el registrador raíz.

Esta función no hace nada si el registrador raíz ya tiene controladores configurados para ello.

Parece que ipython notebook llama a basicConfig (o set handler) en alguna parte.

falsetru
fuente
44
Lo mismo ocurre en una consola IPython normal: no imprime nada, a menos que loggerse cree una raíz .
Ioannis Filippidis
1
Esta solución funciona nuevamente en ipykernel4.5 (posiblemente tan pronto como 4.4) github.com/jupyter/notebook/issues/1397
pylang
17
Esto ya no funciona. No con el Jupyter Notebook 5.3.0
Wesam
65

Si aún desea usar basicConfig, vuelva a cargar el módulo de registro de esta manera

from importlib import reload  # Not needed in Python 2
import logging
reload(logging)
logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=logging.DEBUG, datefmt='%I:%M:%S')
Maravilla
fuente
16
Para cualquiera que intente hacer esto en Python 3: reloadahora esimp.reload
kuzzooroo
11
a partir de Python 3.5, debe usar importlib.reload ya que el módulo imp está en desuso.
Webucator
2
Si alguien está teniendo problemas con Spyder con el registro (donde todos los intentos de modificar el comportamiento del registrador no tuvieron éxito), esto simplemente terminó con una persecución de ganso de un día. github.com/spyder-ide/spyder/issues/2572 ¡ Muchas gracias!
FrenchKheldar
28

Tengo entendido que la sesión de IPython inicia el registro, por lo que basicConfig no funciona. Aquí está la configuración que funciona para mí (desearía que esto no fuera tan asqueroso ya que quiero usarlo para casi todos mis portátiles):

import logging
logger = logging.getLogger()
fhandler = logging.FileHandler(filename='mylog.log', mode='a')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fhandler.setFormatter(formatter)
logger.addHandler(fhandler)
logger.setLevel(logging.DEBUG)

Ahora cuando corro:

logging.error('hello!')
logging.debug('This is a debug message')
logging.info('this is an info message')
logging.warning('tbllalfhldfhd, warning.')

Obtengo un archivo "mylog.log" en el mismo directorio que mi cuaderno que contiene:

2015-01-28 09:49:25,026 - root - ERROR - hello!
2015-01-28 09:49:25,028 - root - DEBUG - This is a debug message
2015-01-28 09:49:25,029 - root - INFO - this is an info message
2015-01-28 09:49:25,032 - root - WARNING - tbllalfhldfhd, warning.

Tenga en cuenta que si vuelve a ejecutar esto sin reiniciar la sesión de IPython, escribirá entradas duplicadas en el archivo, ya que ahora habría dos controladores de archivos definidos

skulz00
fuente
3
Para hacer esto menos "asqueroso", coloque el código en un módulo en su ruta de Python e impórtelo. Más bonito y fácil de actualizar en el futuro.
alexis
1
O use logging.config.fileConfig ('logging.conf') y coloque toda la configuración allí.
K.-Michael Aye
14

Tenga en cuenta que stderr es la secuencia predeterminada para el loggingmódulo, por lo que en las notebooks IPython y Jupyter es posible que no vea nada a menos que configure la secuencia en stdout:

import logging
import sys

logging.basicConfig(format='%(asctime)s | %(levelname)s : %(message)s',
                     level=logging.INFO, stream=sys.stdout)

logging.info('Hello world!')
Ataxias
fuente
13

Lo que funcionó para mí ahora (Jupyter, servidor de notebook es: 5.4.1, IPython 7.0.1)

import logging
logging.basicConfig()
logger = logging.getLogger('Something')
logger.setLevel(logging.DEBUG)

Ahora puedo usar el registrador para imprimir información, de lo contrario solo vería un mensaje del nivel predeterminado ( logging.WARNING) o superior.

mcsim
fuente
2
Si, eso funciona. Uno tiene que ejecutar basicConfig()tp para que funcione.
Brandt
11

Puede configurar el registro ejecutando %config Application.log_level="INFO"

Para obtener más información, consulte las opciones del kernel de IPython

Garvey
fuente
1
Bienvenido a StackOverflow y gracias por tu ayuda. Es posible que desee mejorar su respuesta agregando alguna explicación.
Elias MP
1
¡Esta fue realmente la respuesta más útil para mí!
IanS
1
¿Puedes agregar algunas líneas con un ejemplo? ¿Cuál es el identificador de registro para invocar para imprimir mensajes de registro?
Wesam
Al menos ipython 7.9.0 (o jupyter 6.0.2) ignora el código sugerido, ya que no admite esta clase desde la consola en ejecución. Ejecutar %configpara ver los clasificados admitidos, Applicationno es uno de ellos. ipython 7.9.0 aquí.
Stason
4

Configuré un registrador para ambos archivos y quería que apareciera en el cuaderno. Resulta que agregar un controlador de archivos borra el controlador de flujo predeterminado.

logger = logging.getLogger()

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# Setup file handler
fhandler  = logging.FileHandler('my.log')
fhandler.setLevel(logging.DEBUG)
fhandler.setFormatter(formatter)

# Configure stream handler for the cells
chandler = logging.StreamHandler()
chandler.setLevel(logging.DEBUG)
chandler.setFormatter(formatter)

# Add both handlers
logger.addHandler(fhandler)
logger.addHandler(chandler)
logger.setLevel(logging.DEBUG)

# Show the handlers
logger.handlers

# Log Something
logger.info("Test info")
logger.debug("Test debug")
logger.error("Test error")
Bergantín
fuente
0

Parece que las soluciones que funcionaron para versiones anteriores de ipython / jupyter ya no funcionan.

Aquí hay una solución de trabajo para ipython 7.9.0 (también probado con jupyter server 6.0.2):

import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logging.debug("test message")

DEBUG:root:test message
stason
fuente