Ottieni output dal modulo di registrazione in Notebook IPython


127

Quando eseguo quanto segue all'interno di IPython Notebook non vedo alcun output:

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

Qualcuno sa come farlo in modo che io possa vedere il messaggio "test" all'interno del notebook?


Quale versione di IPython stai usando, poiché funziona in 1.0?
Viktor Kerkez,

@ViktorKerkez ipython3 notebook --versionritorna1.0.0
Kyle Brandt,

imgur.com/1b7nGZz Ottengo questo quando provo il tuo codice.
Viktor Kerkez,

@ViktorKerkez: Ya non capisco, suppongo che dovrei presentare un problema ...
Kyle Brandt,

Risposte:


129

Prova a seguire:

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

Secondo logging.basicConfig :

Esegue la configurazione di base per il sistema di registrazione creando uno StreamHandler con un formatter predefinito e aggiungendolo al logger principale. Le funzioni debug (), info (), warning (), error () e critical () chiameranno automaticamente basicConfig () se non sono definiti gestori per il logger root.

Questa funzione non fa nulla se il logger root ha già dei gestori configurati per esso.

Sembra che il notebook ipython chiami da qualche parte basicConfig (o set handler).


4
Lo stesso accade in una normale console IPython: non stampa nulla, a meno che non loggervenga creato un root .
Ioannis Filippidis,

1
Questa soluzione funziona di nuovo in ipykernel4.5 (possibilmente già nel 4.4) github.com/jupyter/notebook/issues/1397
pylang

17
Questo non funziona più. Non con Jupyter Notebook 5.3.0
Wesam,

65

Se si desidera ancora utilizzare basicConfig, ricaricare il modulo di registrazione in questo modo

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')

16
Per chiunque cerchi di farlo in Python 3: reloadè oraimp.reload
kuzzooroo il

11
a partire da Python 3.5, dovresti usare importlib.reload poiché il modulo imp viene deprecato.
Webucator,

2
Se qualcuno ha problemi con Spyder con la registrazione (dove tutti i tentativi di modificare il comportamento del logger non hanno avuto successo), questo ha appena concluso un giorno di caccia all'oca. github.com/spyder-ide/spyder/issues/2572 Grazie mille!
FrenchKheldar,

28

La mia comprensione è che la sessione IPython avvia la registrazione in modo che basicConfig non funzioni. Ecco la configurazione che funziona per me (vorrei che non fosse così grossolana poiché voglio usarlo per quasi tutti i miei notebook):

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)

Ora quando corro:

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

Ottengo un file "mylog.log" nella stessa directory del mio taccuino che 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.

Si noti che se si esegue nuovamente senza riavviare la sessione IPython, verranno scritte voci duplicate nel file poiché ora sarebbero definiti due gestori di file


3
Per rendere questo aspetto meno "grossolano", inserisci il codice in un modulo sul tuo percorso Python e importalo. Più bello e facile da aggiornare in futuro.
alexis,

1
Oppure usa logging.config.fileConfig ('logging.conf') e inserisci tutte le impostazioni.
K.-Michael Aye,

14

Tieni presente che stderr è lo stream predefinito per il loggingmodulo, quindi nei notebook IPython e Jupyter potresti non vedere nulla a meno che non configuri lo stream su stdout:

import logging
import sys

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

logging.info('Hello world!')

13

Ciò che ha funzionato per me ora (Jupyter, server notebook è: 5.4.1, IPython 7.0.1)

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

Ora posso usare il logger per stampare informazioni, altrimenti vedrei solo messaggi dal livello predefinito ( logging.WARNING) o superiore.


2
Sì, funziona. Si deve eseguire basicConfig()tp farlo funzionare.
Brandt

11

È possibile configurare la registrazione eseguendo %config Application.log_level="INFO"

Per ulteriori informazioni, consultare Opzioni del kernel IPython


1
Benvenuto in StackOverflow e grazie per il tuo aiuto. Potresti voler migliorare ulteriormente la tua risposta aggiungendo qualche spiegazione.
MP Elias,

1
Questa è stata in realtà la risposta più utile per me!
IanS,

1
Puoi aggiungere qualche riga con un esempio? Qual è l'handle del logger da invocare per stampare i messaggi di log?
Wesam,

Almeno ipython 7.9.0 (o jupyter 6.0.2) ignora il codice suggerito, poiché non supporta questa classe dalla console in esecuzione. Esegui %configper vedere il supportato classificato, Applicationnon è uno di questi. ipython 7.9.0 qui.
Stason,

4

Ho installato un logger per entrambi i file e volevo che venisse visualizzato sul notebook. Si scopre che l'aggiunta di un gestore di file cancella il gestore di flussi predefinito.

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")

0

Sembra che le soluzioni che funzionavano con le versioni precedenti di ipython / jupyter non funzionassero più.

Ecco una soluzione funzionante per ipython 7.9.0 (testata anche con jupyter server 6.0.2):

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

DEBUG:root:test message
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.