Obtenir la sortie du module de journalisation dans IPython Notebook


127

Lorsque j'exécute ce qui suit dans IPython Notebook, je ne vois aucune sortie:

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

Quelqu'un sait comment faire pour que je puisse voir le message "test" à l'intérieur du cahier?


Quelle version d'IPython utilisez-vous, puisque cela fonctionne dans la version 1.0?
Viktor Kerkez

@ViktorKerkez ipython3 notebook --versionrevient1.0.0
Kyle Brandt

imgur.com/1b7nGZz J'obtiens ceci quand j'essaye votre code.
Viktor Kerkez

@ViktorKerkez: Oui, je ne comprends pas, je suppose que je devrais déposer un problème ...
Kyle Brandt

Réponses:


129

Essayez de suivre:

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

Selon logging.basicConfig :

Effectue une configuration de base pour le système de journalisation en créant un StreamHandler avec un formateur par défaut et en l'ajoutant à l'enregistreur racine. Les fonctions debug (), info (), warning (), error () et critical () appelleront automatiquement basicConfig () si aucun gestionnaire n'est défini pour le journal racine.

Cette fonction ne fait rien si l'enregistreur racine a déjà des gestionnaires configurés pour cela.

Il semble que le notebook ipython appelle basicConfig (ou set handler) quelque part.


4
La même chose se produit dans une console IPython normale: elle n'imprime rien, sauf si une racine loggerest créée.
Ioannis Filippidis

1
Cette solution fonctionne à nouveau en ipykernel4.5 (peut-être dès 4.4) github.com/jupyter/notebook/issues/1397
pylang

17
Cela ne fonctionne plus. Pas avec le Jupyter Notebook 5.3.0
Wesam

65

Si vous souhaitez toujours utiliser basicConfig, rechargez le module de journalisation comme ceci

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
Pour tous ceux qui essaient de faire cela en Python 3: reloadc'est maintenantimp.reload
kuzzooroo

11
à partir de Python 3.5, vous devez utiliser importlib.reload car le module imp est obsolète.
Webucator

2
Si quelqu'un a des problèmes avec Spyder avec la journalisation (où toutes les tentatives de modification du comportement de l'enregistreur ont échoué), cela vient de mettre fin à une poursuite d'une journée. github.com/spyder-ide/spyder/issues/2572 Merci beaucoup!
FrenchKheldar

28

Je crois comprendre que la session IPython démarre la journalisation, donc basicConfig ne fonctionne pas. Voici la configuration qui fonctionne pour moi (j'aimerais que ce ne soit pas si grossier car je veux l'utiliser pour presque tous mes ordinateurs portables):

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)

Maintenant, quand je cours:

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

J'obtiens un fichier "mylog.log" dans le même répertoire que mon notebook qui contient:

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.

Notez que si vous réexécutez ceci sans redémarrer la session IPython, il écrira des entrées en double dans le fichier car il y aurait maintenant deux gestionnaires de fichiers définis


3
Pour rendre cela moins "grossier", placez le code dans un module sur votre chemin python et importez-le. Plus joli et facile à mettre à niveau à l'avenir.
alexis

1
Ou utilisez logging.config.fileConfig ('logging.conf') et mettez-y toute la configuration.
K.-Michael Aye

14

Gardez à l'esprit que stderr est le flux par défaut du loggingmodule, donc dans les notebooks IPython et Jupyter, vous ne verrez peut-être rien à moins que vous ne configuriez le flux sur 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

Ce qui a fonctionné pour moi maintenant (Jupyter, serveur de notebook est: 5.4.1, IPython 7.0.1)

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

Maintenant, je peux utiliser un enregistreur pour imprimer des informations, sinon je ne verrais que le message du niveau par défaut ( logging.WARNING) ou supérieur.


2
Oui, ça marche. Il faut exécuter basicConfig()tp pour que ça marche.
Brandt

11

Vous pouvez configurer la journalisation en exécutant %config Application.log_level="INFO"

Pour plus d'informations, consultez les options du noyau IPython


1
Bienvenue dans StackOverflow et merci pour votre aide. Vous voudrez peut-être améliorer votre réponse en ajoutant des explications.
Elias MP

1
C'était en fait la réponse la plus utile pour moi!
IanS

1
Pouvez-vous ajouter quelques lignes avec un exemple? Quelle est la poignée de journalisation à appeler pour imprimer les messages du journal?
Wesam

Au moins ipython 7.9.0 (ou jupyter 6.0.2) ignore le code suggéré, car il ne prend pas en charge cette classe depuis la console en cours d'exécution. Exécuter %configpour voir les classés pris en charge, Applicationn'est pas l'un d'entre eux. ipython 7.9.0 ici.
stason le

4

J'ai configuré un enregistreur pour les deux fichiers et je voulais qu'il apparaisse sur le cahier. Il s'avère que l'ajout d'un gestionnaire de fichiers efface le gestionnaire de flux par défaut.

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

Il semble que les solutions qui fonctionnaient pour les anciennes versions d'ipython / jupyter ne fonctionnent plus.

Voici une solution de travail pour ipython 7.9.0 (également testée avec jupyter server 6.0.2):

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

DEBUG:root:test message
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.